1

我有一个通用类型 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.SelectableViewModel1[Domain.Assignment]]”,但此字典需要类型为“Web.Models.SelectableViewModel`1[Domain.Assignment]”的模型项.

4

1 回答 1

1

那是因为编辑器模板需要 single SelectableViewModel<Assignment>,但是你通过IEnumerable<SelectableViewModel<Assignment>>并明确指示它使用"SelectableAssignment"模板,所以抛出异常。您可以像这样遍历模型并一一调用编辑器模板:

@foreach(var item in Model)
{
   @Html.EditorFor(m => item, "SelectableAssignment")
}

EditorFor或者,简单地说,从代码中的方法调用中删除该模板名称。框架应该弄清楚它应该调用EditorFor传递集合中的每个项目

@Html.EditorFor(m => m)

或者,同样的,调用

@Html.EditorForModel()
于 2011-10-11T12:02:48.983 回答