MVC3 IEnumerable模型找不到正确的编辑器模板

Kyl*_*man 5 ienumerable mvc-editor-templates razor asp.net-mvc-3

我有以下型号:

public class Filter
{
    public string Field { get; set; }

    public string Operator { get; set; }

    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以下控制器:

public class FilterController
{
    public ActionResult Index()
    {
        IList<Filter> model = new List<Filter>() {
            new Filter(), 
            new Filter()
        };

        return View(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下观点:

@model IEnumerable<Filter>
@Html.EditorForModel()
Run Code Online (Sandbox Code Playgroud)

这应该查找我的EditorTemplate Filter.cshtml,并为列表中的每个元素渲染模板,对吧?

使用Glimpse,我注意到MVC正在寻找IEnumerable`1.cshtml而不是Filter.cshtml

我使用时会发生同样的事情

@Html.EditorFor(model => model)
Run Code Online (Sandbox Code Playgroud)

当我这样做:

@Html.EditorFor(model => model, "Filter")
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,说它Filter.cshtml期待一个类型的模型,Filter但它收到了一个类型的模型IEnumerable<Filter>

我这样做了吗?我是否需要做任何其他事情才能使用正确的编辑器模板正确渲染模型列表?

Dav*_*Fox 3

我过去确实遇到过 EditorTemplates 的问题,但我认为这主要是用户错误。

一种可能的解决方法是将集合封装在单个视图模型类中并将其传递给视图

public class MySweetFilterViewModel
{
    public IEnumerable<Filter> Filters { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用单个视图来区分集合

@model Project.Models.MySweetFilterViewModel
@Html.EditorFor(x => x.Filters)
Run Code Online (Sandbox Code Playgroud)

只要确保你的控制器封装

public ActionResult Index()
{
    //...
    return View(new MySweetFilterViewModel() { Filters = model });
}
Run Code Online (Sandbox Code Playgroud)