首先,我有一个类似这样的视图模型:
[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()
调用依赖于 ViewData 中用于下拉菜单的 SelectList 对象。我尝试通过在我的自定义控制器基类中使用以下覆盖来保证这一点:
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