0

現在、いくつかのユーザー プロファイルの詳細と、ユーザーが割り当てられている役割のリストで構成される編集ビューを作成しようとしています。すべてのユーザー プロファイル テキストボックスを含む編集可能な親ビューを作成し、すべてのロールのチェックボックスを保持する部分ビューを挿入できると考えました。

ただし、部分ビューでテキスト ボックスを更新しようとすると、それらの変更が親モデルに反映されないことがわかりました。どうやら、部分ビューは、親から分離された独自の ViewData ディクショナリを取得します。

部分的なビューでチェックボックスに加えられた変更を親のモデルに戻すことができるソリューションを誰かが持っているかどうか疑問に思っていました。以下にいくつかのサンプルコードを含めました。親ビューは次のとおりです。

@model MvcWebsite.ViewModels.UserProfileEditViewModel

@{
ViewBag.Title = "Edit";
}

<h2>Edit</h2>

@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

<fieldset>
    <legend>UserProfile</legend>

    @Html.HiddenFor(model => model.UserId)

    <div class="editor-label">
        @Html.LabelFor(model => model.UserName)
    </div>

... other properties of the user profile omitted for brevity

    <div class="editor-field">

        @Html.Partial("RoleCheckBoxEditTable", Model.Roles)
    </div>
    <p>
        <input type="submit" value="Save" />
    </p>
</fieldset>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>

次に、子の部分ビューがあります。

@model List<MvcWebsite.ViewModels.RoleViewModel>

<table>
<tr>
    @{
        int count = 0;
        foreach (var roleViewModel in Model)
        {
            if(count++ % 3 == 0)
            {
                @: </tr> <tr>
            }
            <td>
                @Html.HiddenFor(r => roleViewModel.RoleName) 
                @Html.HiddenFor(r => roleViewModel.RoleId) 
                @Html.CheckBoxFor(r => roleViewModel.Assigned)
            </td>
            <td>
                @Html.LabelFor(r => roleViewModel.Assigned, roleViewModel.RoleName)
            </td>
        }
    }

</tr>
</table>

私が望むのは、これらのビューの両方で同じモデルを更新し、コントローラーに送信できるようにする方法を見つけることです。どんな助けでも大歓迎です。

4

1 に答える 1

0

この問題を回避するには、部分ビューを完全に削除し、それらを表示テンプレートとエディター テンプレートに置き換えました。

のリストのビューから内容を取得し、その名前のRoleViewModel下に新しいビューを作成します (以前に使用したことがない場合は、最初にディレクトリを作成する必要がある場合があります)。Views/Shared/EditorTemplatesRoleViewModel.cshtmlEditorTemplates

最上位ビューで、次のように変更Partialします。EditorFor@Html.EditorFor(model => model.Roles)

このアプローチは私にとってはうまくいきIValidatable、モデルのインターフェースを使用して取得した組み込みの検証を保持します。

于 2013-05-31T15:20:25.770 に答える