首先,我有一个像这样的视图模型:
[Required]
[Display(Name = "Department")]
[UIHint("DropDown", "MVC", "SelectListName", "DepartmentSelectList")]
public Guid? DepartmentId { get; set; }
我有DropDown
的编辑器模板(由UIHint设置),其工作方式如下:
@{
var list = this.GetModelSelectList();
}
@Html.DropDownListFor(m => Model, list)
this.GetModelSelectList()
调用依赖于用于下拉列表的SelectList对象存在于ViewData中。我尝试通过在我的自定义控制器基类中使用以下覆盖来保证这一点:
protected override ViewResult View(string viewName, string masterName, object model)
{
var result = base.View(viewName, masterName, model);
if ((model is ViewModel) && (!ViewData.ContainsKey(SelectListsViewDataKey)))
{
var vm = (ViewModel)model;
result.ViewData.Add(SelectListsViewDataKey, vm.GetSelectLists());
}
return result;
}
这避免了我必须在我的控制器上进行显式调用以添加选择列表来查看数据。 SelectList类型的任何属性始终在视图数据中可用。
我的问题是,是否有更好的注射方法。是否有更专注或更适合此类应用的切入点?
编辑: 我这样做是因为单个视图模型属性的编辑器模板无法访问整个视图模型实例,并且我的选择列表对象在此实例中。见https://stackoverflow.com/a/9867542/8741