我有以下模型:
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()
这应该查找我的编辑器模板Filter.cshtml
,并为列表中的每个元素呈现模板,对吗?
使用Glimpse,我注意到MVC正在寻找IEnumerable`1.cshtml
而不是Filter.cshtml
当我使用
@Html.EditorFor(model => model)
当我这样做时:
@Html.EditorFor(model => model, "Filter")
我收到一个错误,说Filter.cshtml
期待 Filter
类型的模型,但它收到了 IEnumerable<Filter>
类型的模型
我这样做是否正确? 我是否需要执行任何其他操作才能使用正确的编辑器模板正确呈现模型列表?
我过去肯定在使用编辑器模板时遇到过问题,但我认为这主要是用户错误。
一种可能的解决方法是将集合封装在单个视图模型类中,并将其传递给视图
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 });
}
回答你关于为什么...让我们尝试一些事情。
如果以这种方式编写代码会发生什么:
return View(new List<Filter>{ new Filter(), new Filter() });
可能是因为您使用的是中间 IList 而不是列表,因此有些东西变得混乱了。 (在我的理论中)将要发生的事情是,传递IList<Filter>
会导致将标准IEnumerable
而不是IEnumerable<Filter>
传递给视图。
您也可以尝试model.AsEnumerable<Filter>()