在视图模型中包含选择列表的数据源时,建议的最佳实践似乎存在脱节。例如,许多最佳实践博客文章将推荐以下内容:
视图模型:
public class InvoiceViewModel
{
[UIHint("SelectInvoiceType")]
public int idInvoiceType { get; set; }
/* snip */
/* I'll use this in the view to generate a SelectList */
public List<invoicetype> InvoiceTypes { get; set; }
}
但是当我们进入编辑器模板时,Model对象将只是int,不知道包含视图模型:
SelectInvoiceType.cshtml
@model int
@{
Layout = "~/Views/Shared/_EditorFormItem.cshtml";
List<SelectListItem> selList = /* nothing to say here, really */;
}
@section DataContent {
@Html.DropDownListFor(m => Model, selList, null)
}
所以,除非我遗漏了一些东西,否则这两个“最佳实践” - 视图模型中的模板化视图助手和强类型列表数据 - 只能不能一起使用。您有来将您的列表数据填充到ViewBag中。听起来不错?
很抱歉听起来不相信,但我觉得我一定会错过一些东西。
答案 0 :(得分:1)
您必须将列表数据填充到ViewBag中。听起来不错?
没有。对我来说,在ViewBag / ViewData中填充东西听起来不对。您不应将int
作为模型类型用于应该生成下拉列表的编辑器模板。下拉列表由两个属性组成:用于绑定所选值的标量类型和用于在此ddl中生成不同选项的集合。
所以更正确的方法如下:
public class MyViewModel
{
[UIHint("SelectInvoiceType")]
public InvoiceTypesViewModel Invoice { get; set; }
... some other properties specific to the view
}
其中InvoiceTypesViewModel
是一个视图模型,并且不包含对示例中列表中invoicetype
等域模型的任何引用:
public class InvoiceTypesViewModel
{
public int SelectedInvoiceType { get; set; }
public SelectList InvoiceTypes { get; set; }
}
然后在主视图中:
@model MyViewModel
...
@Html.EditorFor(x => x.Invoice)
和编辑器模板:
@model InvoiceViewModel
@Html.DropDownListFor(m => m.SelectedInvoiceType, Model.InvoiceTypes)