基于属性名称的共享编辑器模板?

时间:2013-06-26 21:55:18

标签: asp.net-mvc

在ASP.net MVC 4 Web应用程序中,我有5个模型类,它们都具有相同的属性,比如string ManufacturerName。我想在数据库中显示制造商的下拉列表(使用ViewBag从控制器传递到视图的列表数据)在这些模型的创建/编辑模板中。可以这样做,但我在所有5个编辑器模板中重复下拉代码

@Html.DropDownList("ManufacturerName", new SelectList(ViewBag.ManufacturerList))

我希望有一些方法可以将名为“Manufacturer.cshtml”的编辑器模板中的上述下拉代码编写为部分视图,并且可以从模型模板中调用它,如此

@Html.EditorForModel(model => model.ManufacturerName)

我知道上面的行通常会调用string的编辑器模板,因为这是ManufacturerName的类型,但有没有办法改变它以匹配属性名称?

2 个答案:

答案 0 :(得分:4)

~/Views/Shared/EditorTemplates/Manufacturer.cshtml中创建一个新的EditorTemplate:

@Html.DropDownList("ManufacturerName", new SelectList(ViewBag.ManufacturerList))

然后使用[UIHint]

装饰ViewModel中的属性
[UIHint("Manufacturer")]
public string ManufacturerName { get; set; }

或者,如果您不想修改ViewModel,可以将templateName参数传递给EditorFor()方法:

@Html.EditorFor(x => x.Manufacturer, "Manufacturer")

最后一种方法的问题是,如果使用@Html.EditorForModel()呈现编辑器,则不会使用相应的模板。

答案 1 :(得分:1)

创建一个ViewModel,它保存在SelectList和要绑定的属性上:

public class ManufacturerListViewModel
{
   public SelectList ManufacturerList { get; set; }
   public string ManufacturerName { get; set; }
}

然后编辑模板:

@model ManufacturerListModel
@Html.DropDownListFor(model => model.ManufacturerName, Model.ManufacturerList)

然后在你的观点中调用它:

@Html.EditorFor(model => model.Manufacturer)