0

私はMVCにかなり慣れていないので、何か間違っていると確信しています。私は、HTML ですべて手作業で作成することに戻るのではなく、すべて MVC の方法で行うように最善を尽くしています。

これが私の編集ビューです

@model NotesBoard.Models.RoleViewModel

@{
     ViewBag.Title = "Edit";
}

<h2>Edit</h2>

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

<fieldset>
    <legend>RoleViewModel</legend>
    @Html.HiddenFor(model => model.Role.Name)

    <div class="editor-label">
        @Html.LabelFor(model => model.Role.Name)
    </div>
    <div class="editor-field">
        @Html.DisplayFor(model => model.Role.Name)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Role.Users)
    </div>
    <div class="editor-field">
        <table>
            <tr>
                <td class="remove-td">Tick to Remove</td>
                <td></td>
                <td class="add-td">Tick to Add</td>
            </tr>
            <tr>
                <td style="vertical-align:top; margin: 0px;">
                    <table style="margin: 0px;">
                    @foreach (var item in Model.Role.Users)
                    {
                        <tr>
                            <td class="remove-td">
                                @Html.CheckBoxFor(modelItem => item.State)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.User)
                            </td>
                        </tr>
                    }
                    </table>
                </td>
                <td></td>
                <td style="vertical-align:top; margin:0px;">
                    <table style="margin: 0px;">
                    @foreach (var item in Model.Users)
                    {
                        Boolean RoleUser = Model.Role.Users.Exists(model => model.User == item.User);
                        <tr>
                        @if(RoleUser)
                        {
                            <td class="add-td">
                                @Html.CheckBoxFor(modelItem => item.State, new { disabled=true })
                            </td>
                            <td class="disabled-label">
                                @Html.DisplayFor(modelItem => item.User)
                            </td>
                        }
                        else
                        {
                            <td class="add-td">
                                @Html.CheckBoxFor(modelItem => item.State, new { id=item.User })
                            </td>
                            <td>
                                @Html.DisplayFor(midelItem => item.User)
                            </td>
                        }
                        </tr>
                    }
                    </table>
                </td>
            </tr>
        </table>
    </div>

    <p>
        <input type="submit" value="Save" />
    </p>
</fieldset>
 }

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

 @section Scripts {
     @Scripts.Render("~/bundles/jqueryval")
 }

そして、ここに私のモデルがあります:

public class AccountUser
{
    public AccountUser() { }

    public AccountUser(Int32 id, String user)
    {
        Id = id;
        User = user;
    }

    [Key]
    public Int32 Id { get; set; }
    public String User { get; set; }
}

public class AccountUserViewModel : AccountUser
{
    public AccountUserViewModel(Int32 id, String user, Boolean State = false)
    {
        Id = id;
        User = user;
    }

    public Boolean State { get; set; }
}

public class RoleModel
{
    public String Name { get; set; }
    public List<AccountUserViewModel> Users { get; set; }
}

public class RoleViewModel
{
    public RoleModel Role { get; set; }
    public List<AccountUserViewModel> Users { get; set; }
}

編集ビューからポストバックを取得すると、両方のユーザー リストが null になります。

これまでのコントローラーの Post メソッドは次のとおりです。

    [HttpPost]
    [Authorize(Roles = "Admin")]
    public ActionResult Edit(RoleViewModel model)
    {
        if (ModelState.IsValid)
        {
            var data = Request.Form;
            return RedirectToAction("Index");
        }
        return View(model);
    }

Request.form コレクションを使用してデータを直接抽出しようとすると、チェックボックスはすべて「item.state」という名前になります。基本的にプレーンな古い HTML でフォームを自分で作成することに戻らずに、このビューを実装して降下データを取得するにはどうすればよいですか?

4

1 に答える 1

1

foreachリストをループに変更しFORて、インデックスをラムダで使用し、Razor ビューで正しくレンダリングできるようにします。

                @for (int i = 0; i < Model.Users.Count(); i++) {

                {

                    <tr>
                    @if(RoleUser)
                    {
                        <td class="add-td">
                            @Html.CheckBoxFor(modelItem => Model.Users[i].State, new { disabled = true })
                        </td>
                        <td class="disabled-label">
                            @Html.DisplayFor(modelItem => Model.Users[i].User)
                        </td>
                   ...
                   ...

モデル バインダーは、データをリストに正しくバインドします。

この SO の回答を確認してください: https://stackoverflow.com/a/6585642/1099260

于 2013-01-04T12:13:55.070 に答える