视图模型中的模板化助手和选择列表不混合:是吗?

时间:2011-09-20 22:45:05

标签: asp.net-mvc asp.net-mvc-3

在视图模型中包含选择列表的数据源时,建议的最佳实践似乎存在脱节。例如,许多最佳实践博客文章将推荐以下内容:

视图模型:

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中。听起来不错?

很抱歉听起来不相信,但我觉得我一定会错过一些东西。

1 个答案:

答案 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)