我在编辑模式下的表单上有许多ListBoxFor元素。如果字段中记录了数据,则表单打开时,先前选择的项目将正确显示。如果该字段为空虽然引发了错误,因为items参数不能为null。有没有办法检查视图,是否有数据使用带有四个参数的ListBoxFor但是如果不只使用三个参数,则省略所选项?
这就是我声明ListBoxFor:
的方式@Html.ListBoxFor(model => model.IfQualityPoor, new MultiSelectList(ViewBag.IfPoor, "Value", "Text", ViewBag.IfQualityPoorSelected), new { @class = "chosen", multiple = "multiple" })
我正在使用ViewBag传递ICollection,它将所选项保存为控制器,然后连接或拆分字符串以绑定到模型字段。 MultiSelectLists对我来说总是有问题。
答案 0 :(得分:1)
你的问题并不完全清楚,但是你自己要比使用ListBoxFor
更难。 DropDownListFor
或ListBoxFor
所需的只是IEnumerable<SelectListItem>
。 Razor将根据ModelState
因此,假设ViewBag.IfPoor
为IEnumerable<SelectListItem>
,您在视图中所需要的只是:
@Html.ListBoxFor(m => m.IfQualityPoor, (IEnumerable<SelectListItem>)ViewBag.IfPoor, new { @class = "chosen" })
正确的选项将根据模型中selected
的值标记为IfQualityPoor
。此外,您无需在multiple = "multiple"
参数中传递htmlAttributes
,因为只需使用ListBoxFor
而不是DropDownListFor
即可。{/ p>
如果您使用视图模型然后将选项添加为属性,情况会更好。然后,您不必担心在视图中进行转换,这始终是引入运行时异常的好方法。例如:
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
/与F
交互,并在保存时自动在数据库中设置正确的字符串。