MVC3 EditorFor和泛型类型抛出错误

时间:2011-10-11 10:42:05

标签: asp.net-mvc-3 generics editorfor

我有一个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]'。

1 个答案:

答案 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()