我有一个Generic类型SelectableViewModel
public class SelectableViewModel<T> where T : class
{
public SelectableViewModel(T model)
{
Model = model;
}
public T Model { get; set; }
public bool Selected { get; set; }
}
它包装了一个ViewModel,以便用户可以从视图中选择或取消选择模型。
控制器方法
public ActionResult ListReconsiledAssignments()
{
return View(
assignmentRepository.ListReconsiled()
.Select(a => new SelectableViewModel<Assignment>(a))
);
}
视图
@model IEnumerable<SelectableViewModel<Assignment>>
@{
ViewBag.Title = "Request snapshot";
}
<h2>Request snapshot</h2>
<table>
<thead>
<tr>
<th></th>
<th>Number</th>
<th>Name</th>
</tr>
</thead>
@Html.EditorFor(m => m, "SelectableAssignment")
</table>
名为SelectableAssignment.cshtml的模板编辑器
@model SelectableViewModel<Assignment>
<tr>
<td>@Html.CheckBoxFor(m => m.Selected)</td>
<td>@Model.Model.KufId</td>
<td>@Model.Model.Name</td>
</tr>
这会引发异常
传递到字典中的模型项是类型的 'System.Linq.Enumerable + WhereSelectListIterator
2[Domain.Assignment,Web.Models.SelectableViewModel
1 [Domain.Assignment]]', 但是这个字典需要一个类型的模型项 'Web.Models.SelectableViewModel`1 [Domain.Assignment]'。
答案 0 :(得分:1)
这是因为编辑器模板需要单SelectableViewModel<Assignment>
,但您传递IEnumerable<SelectableViewModel<Assignment>>
并明确指示它使用"SelectableAssignment"
模板,因此抛出异常。您可以迭代模型并逐个调用编辑器模板,如下所示:
@foreach(var item in Model)
{
@Html.EditorFor(m => item, "SelectableAssignment")
}
或者,简单地说,从代码中的EditorFor
方法调用中删除该模板名称。框架应该确定它应该为传递集合中的每个项目调用EditorFor
@Html.EditorFor(m => m)
或者,同样,致电
@Html.EditorForModel()