5

我有以下模型:

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

    public string Operator { get; set; }

    public string Value { get; set; }
}

以及以下控制器:

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

        return View(model);
    }
}

以及以下观点:

@model IEnumerable<Filter>
@Html.EditorForModel()

这应该寻找我的 EditorTemplate Filter.cshtml,并为列表中的每个元素呈现模板,对吗?

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

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

@Html.EditorFor(model => model)

当我这样做时:

@Html.EditorFor(model => model, "Filter")

我收到一条错误消息,说需要Filter.cshtml一个类型的模型,Filter但它收到了一个类型的模型IEnumerable<Filter>

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

4

2 回答 2

3

I've definitely had issues in the past with EditorTemplates, but I think it was mostly user error.

One possible workaround is to encapsulate your collection in a single, view model class and pass that to the view

public class MySweetFilterViewModel
{
    public IEnumerable<Filter> Filters { get; set; }
}

Then you could use a single view to pick apart the collection

@model Project.Models.MySweetFilterViewModel
@Html.EditorFor(x => x.Filters)

Just make sure your controller encapsulates

public ActionResult Index()
{
    //...
    return View(new MySweetFilterViewModel() { Filters = model });
}
于 2012-04-19T20:16:37.387 回答
1

要回答您关于为什么...让我们尝试一些事情的问题。

如果您以这种方式编写代码会发生什么:

return View(new List<Filter>{ new Filter(), new Filter() });

可能是因为您使用的是中间 IList 而不是 List,所以有些事情会变得混乱。将会发生的事情(在我的理论中)是传递 anIList<Filter>导致标准IEnumerable而不是IEnumerable<Filter>传递给视图。

你也可以试试model.AsEnumerable<Filter>()

于 2012-04-19T20:54:02.053 回答