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

これは、エディター テンプレートが singleSelectableViewModel<Assignment>を必要とするためですが、テンプレートを使用するように渡しIEnumerable<SelectableViewModel<Assignment>>て明示的に指示すると"SelectableAssignment"、例外がスローされます。次のように、モデルを反復処理してエディター テンプレートを 1 つずつ呼び出すことができます。

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

または、単純に、EditorForコードのメソッド呼び出しからそのテンプレート名を削除します。EditorForフレームワークは、渡されたコレクション内のすべてのアイテムを呼び出す必要があることを理解する必要があります

@Html.EditorFor(m => m)

または、同じように呼び出します

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