在视图中显示之前检查 ListBoxFor selectedValues 是不是为空?
Posted
技术标签:
【中文标题】在视图中显示之前检查 ListBoxFor selectedValues 是不是为空?【英文标题】:Check if ListBoxFor selectedValues is null before display in view?在视图中显示之前检查 ListBoxFor selectedValues 是否为空? 【发布时间】:2016-09-12 07:51:48 【问题描述】:我在编辑模式下的表单上有许多 ListBoxFor 元素。如果字段中记录了数据,则当表单打开时,先前选择的项目会正确显示。如果字段为空,但由于 items 参数不能为空而引发错误。有没有办法在视图中检查,如果有数据可以使用带有四个参数的 ListBoxFor,但如果不是只使用三个参数,则忽略所选项目?
这就是我声明 ListBoxFor 的方式:
@html.ListBoxFor(model => model.IfQualityPoor, new MultiSelectList(ViewBag.IfPoor, "Value", "Text", ViewBag.IfQualityPoorSelected), new @class = "chosen", multiple = "multiple" )
我正在使用 ViewBag 传递 ICollection,该 ICollection 将所选项目作为控制器,然后加入或拆分字符串以绑定到模型字段。 MultiSelectLists 对我来说总是有问题。
【问题讨论】:
【参考方案1】:您的问题并不完全清楚,但您对自己的要求比使用ListBoxFor
时要困难得多。对于DropDownListFor
或ListBoxFor
,您只需要IEnumerable<SelectListItem>
。 Razor 将根据ModelState
选择任何合适的值。
所以,假设ViewBag.IfPoor
是IEnumerable<SelectListItem>
,你需要的只是:
@Html.ListBoxFor(m => m.IfQualityPoor, (IEnumerable<SelectListItem>)ViewBag.IfPoor, new @class = "chosen" )
根据您模型上IfQualityPoor
的值,正确的选项将被标记为selected
,应该是这样。此外,没有必要在htmlAttributes
参数中传递multiple = "multiple"
,因为您只需使用ListBoxFor
而不是DropDownListFor
。
如果您使用视图模型,然后将选项添加为属性,那就更好了。然后,您不必担心在视图中进行强制转换,这始终是引入运行时异常的好方法。例如:
public class FooViewModel
...
public IEnumerable<SelectListItem> IfQualityPoorOptions get; set;
然后,您在您的操作中设置它,然后返回视图(而不是设置ViewBag
)。最后,在你看来:
@Html.ListBoxFor(m => m.IfQualityPoor, Model.IfQualityPoorOptions, new @class = "chosen" )
简单得多,而且这样做永远不会有任何问题。
更新(基于评论)
将列表扁平化为用于数据库存储的字符串的最佳方法是为此使用特殊属性,然后自定义 getter 和 setter 以映射到/从。例如:
public string IfQualityPoor
get return IfQualityPoorList != null ? String.Join(",", IfQualityPoorList) : null;
set IfQualityPoorList = !String.IsNullOrWhiteSpace(value) ? value.Split(',').ToList() : null;
[NotMapped]
public List<string> IfQualityPoorList get; set;
然后,您发布到IfQualityPoorList
/与IfQualityPoorList
交互,保存时将在数据库中自动设置正确的字符串。
【讨论】:
谢谢,克里斯。我这样做是因为我必须收集所选值并将它们连接到一个逗号分隔的字符串中,并将其作为 IfQualityPoor 的值传递回数据库。我现在就按你的方法试试。 尝试了你的第一个选项,它给了我一个“当允许多选时,参数'表达式'必须评估为 IEnumerable。”错误。 这意味着IfQualityPoor
不是可枚举的。如果您正在执行多选,那么您发布到的属性必须是列表类型,因为它必须接受多个发布的值。同样,如果您实际上需要持久化字符串之类的内容,您仍然需要发布到列表,但您可以使用我在上面的更新中添加的代码让列表自动映射到字符串/从字符串中持久化。跨度>
非常感谢,你不知道这让它变得多么简单,特别是因为我有这么多跨多个表单的多选列表以上是关于在视图中显示之前检查 ListBoxFor selectedValues 是不是为空?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查用户之前是不是在 iOS 中查看过推送通知权限警报视图?
在使用 RESideMenu 显示视图控制器之前,使用 AFNetworking 在 didFinishLaunching 中尽快检查可达性