MVC3 EditorFor и универсальные типы выдает ошибку - PullRequest
1 голос
/ 11 октября 2011

У меня есть универсальный тип 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 Ответ

1 голос
/ 11 октября 2011

Это потому, что шаблон редактора требует один SelectableViewModel<Assignment>, но вы передаете IEnumerable<SelectableViewModel<Assignment>> и явно указываете ему использовать шаблон "SelectableAssignment", поэтому возникает исключение.Вы можете перебирать свою модель и вызывать шаблон редактора один за другим, например так:

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

Или просто удалите имя этого шаблона из вызова метода EditorFor из своего кода.Фреймворк должен выяснить, что он должен вызывать EditorFor для каждого элемента в переданной коллекции

@Html.EditorFor(m => m)

Или, аналогично, вызывать

@Html.EditorForModel()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...