2013-06-26 55 views
3

在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的类型,但有没有办法改变它匹配属性名称呢?

回答

3

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

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

然后用[UIHint]装点您的视图模型属性:

[UIHint("Manufacturer")] 
public string ManufacturerName { get; set; } 

另外,如果你不想修改你的视图模型,你可以传递一个templateName参数传递给EditorFor()方法:

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

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

+0

这很好。我不在乎我是否使用EditorFor或EditorForModel或部分视图。 – sgarg

+0

ViewBag是否会从调用视图传递到编辑器模板? – sgarg

+0

'ViewBag'可以在'ViewContext'的整个生命周期中使用。可以是布局,部分,EditorTemplate或常规视图。那么你应该没问题。 – haim770

1

创建保存到你希望绑定到的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) 
+1

我不想更改模型,因为我希望任何其他控制器操作都能够使用该视图,而无需在使用该视图时将该列表附加到该视图。 – sgarg

+0

列表包含应该在没有任何监督的情况下发生,因为它基本上是一个静态列表。有没有Ajax的方式来做到这一点? – sgarg