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

时间:2012-04-19 18:18:39

标签: asp.net-mvc-3 razor ienumerable mvc-editor-templates

我有以下型号:

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>类型的模型

我这样做是否正确?我是否需要执行其他操作才能使用正确的编辑器模板正确呈现模型列表?

2 个答案:

答案 0 :(得分:3)

我在过去使用EditorTemplates肯定遇到过问题,但我认为这主要是用户错误。

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

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

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

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

确保您的控制器封装

public ActionResult Index()
{
    //...
    return View(new MySweetFilterViewModel() { Filters = model });
}

答案 1 :(得分:1)

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

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

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

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

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