1

MVC に問題があるので、説明してみます。私のモデルには2つのクラスがあります。

public class ApplicationPermissionVM
    {
        public ApplicationPermission Permission { get; set; }
        public bool IsSelected { get; set; }
    }

public class RoleAndPermissonsModel
{
        //Constructor skipped

        public ApplicationRole ApplicationRole { get; set; }
        public IEnumerable<ApplicationPermissionVM> Permissions { get; set; }
}

2 番目のモデルがメイン モデルで、コントローラーでモデルを初期化します。ApplicationRole が null で、リストに 19 個の要素があります。フォームを POST すると、ApplicationRole メンバーが作成されますが、アクセス許可リストが空になるため、すべての選択が失われます。誰かが問題が何であるかを知っているなら、私に書いてください。コントローラ:

[HttpGet]
public ActionResult NewRole()
{
    _model = new RoleAndPermissonsModel();
    return View(_model);
}

[HttpPost]
public ActionResult NewRole(RoleAndPermissonsModel newRole)
{
    if (ModelState.IsValid)
    {
        var id = _applicationRoleService.AddNewRole(newRole.ApplicationRole);
        _applicationRoleService.AssignPermissionsToRole(newRole.SelectedItems, id);
    }

    return RedirectToAction("Index");
}

意見:

@model EO.Core.WebUI.Models.RoleAndPermissonsModel
@using (Html.BeginForm("NewRole", "PermissionRole", FormMethod.Post, new { id = "frmNewRole" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>ApplicationRole</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.ApplicationRole.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ApplicationRole.Name)
            @Html.ValidationMessageFor(model => model.ApplicationRole.Name)
        </div>
        <table>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.IsSelected)
                </th>
                <th></th>
            </tr>

            @foreach (var item in Model.Permissions)
            {
                <tr>
                    <td>
                        @Html.EditorFor(modelItem => item.IsSelected)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Permission.Name);
                    </td>
                </tr>
            }
        </table>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}
4

1 に答える 1

1

リストを手動でループして次のように出力する必要があります

<input type="text" 
       id="Permissions[0].IsSelected" 
       name="Permissions[0].IsSelected" value="" />

したがって、コードを次のように変更します。

@for(int i = 0; i < Model.Permissions.Count; i++)
{
    <tr>
        <td><input type="checkbox" 
                   id="Permissions[@(i)].IsSelected" 
                   name="Permissions[@(i)].IsSelected" /></td>
        <td><input type="text" 
                   id="Permissions[@(i)].Permission.Name" 
                   name="Permissions[@(i)].Permission.Name" /></td>
    </tr>
}

型内にオブジェクトがあるため、Permissions初期化を忘れないでください。そうしないと、null 参照が返されます。

public class RoleAndPermissonsModel
{
    public RoleAndPermissonsModel() {
        this.Permissions = new List<ApplicationPermissionVM>();
    }

    public ApplicationRole ApplicationRole { get; set; }
    public IEnumerable<ApplicationPermissionVM> Permissions { get; set; }
}

または、代わりに を簡単に作成し、ViewModelそれを使用してモデルをビューに相互リンクすることができます。

注:リストが常にnullである場合(空/nullリストを渡しているため)、なぜループしているのModel.Permissionsですか?


「EDIT」ビューを実行するには、ループ コードを次のようにする必要があります。

@for(int i = 0; i < Model.Permissions.Count; i++)
{
    <tr>
        <td><input type="checkbox" 
                   @(Permissions[i].IsSelected ? "checked='checked'" : "")
                   id="Permissions[@(i)].IsSelected" 
                   name="Permissions[@(i)].IsSelected" /></td>
        <td><input type="text" 
                   id="Permissions[@(i)].Permission.Name" 
                   name="Permissions[@(i)].Permission.Name"
                   value="@(Permissions[i].Permission.Name)" /></td>
    </tr>
}

追加する必要があるのはchecked、チェックボックスが選択されている場合はチェックボックスに追加し、他の入力に権限名を入力することだけです。

于 2013-06-24T11:59:33.837 に答える