【问题标题】:MVC3 EditorFor and generic types throws errorMVC3 EditorFor 和泛型类型抛出错误
【发布时间】:2011-10-11 10:42:04
【问题描述】:

我有一个通用类型 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+WhereSelectListIterator2[Domain.Assignment,Web.Models.SelectableViewModel1[Domain.Assignment]]', 但是这本字典需要一个类型的模型项 'Web.Models.SelectableViewModel`1[Domain.Assignment]'。

【问题讨论】:

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


    【解决方案1】:

    这是因为编辑器模板需要单个SelectableViewModel&lt;Assignment&gt;,但是你传递IEnumerable&lt;SelectableViewModel&lt;Assignment&gt;&gt;并明确指示它使用"SelectableAssignment"模板,所以抛出异常。您可以像这样遍历您的模型并一一调用编辑器模板:

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

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

    @Html.EditorFor(m => m)
    

    或者,同样的,调用

    @Html.EditorForModel()
    

    【讨论】:

    • 它无法弄清楚,因为它是一个泛型类型,尝试像您的示例一样在循环中执行它,但是模型绑定器无法弄清楚如何将发布的数据反序列化到模型中(我得到了一个 IEnum = null)...
    • 让我澄清一下,@Html.EditorFor(m => m) 不能使用,因为它无法确定要绑定的编辑器,因为它是泛型类型。如果我定义名称它将尝试将列表绑定到单个模型视图。所以我需要一种与@Html.EditorFor(m => m) 执行相同操作但到特定视图的方法
    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多