0

私は以下のクラスを持っています:

public class ControllerSecurityModel
{
    public string ControlleName { get; set; }
    public string DisplayName { get; set; }
    public List<ActionSecurityModel> actions { get; set; }
}
public class ActionSecurityModel
{
    public string ActionName { get; set; }
    public string DisplayName { get; set; }
    public bool IsChecked { get; set; }
}

とモデル:

public class PageRoleModel
{
    public List<ControllerSecurityModel> AllPages { get; set; }

    public List<ControllerSecurityModel> SelectedPage { get; set; }
}

「ActionSecurityModel」ごとにチェックボックスが必要な場合は、ビューの下に書き込みます。

<% using (Html.BeginForm())
   {%>
<% foreach (var cont in Model.AllPages)
   {%>
<fieldset>
    <legend>
        <%= cont.DisplayName  %></legend>
    <% foreach (var act in cont.actions)
       {%>
    <%: Html.CheckBoxFor(x => act.IsChecked) %>
    <%: Html.Label(act.DisplayName) %>
    <% } %>
</fieldset>
<% } %>
<input type="submit" value="save"/>
<% } %>

そして、これは私のコントローラーアクションです:

    public ActionResult SetRole()
    {
        PageRoleModel model = new PageRoleModel();

        return View(model);
    }

    [HttpPost]
    public ActionResult SetRole(PageRoleModel model)
    {
        return View(model);
    }

しかし、フォームを送信すると、モデルはnullですか? チェックボックスを送信して保存するにはどうすればよいですか?

4

1 に答える 1

4

このような:

<% using (Html.BeginForm()) { %>
    <% for (var i = 0; i < Model.AllPages.Count; i++) { %>
    <fieldset>
        <legend>
            <%= Model.AllPages[i].DisplayName %>
        </legend>
        <% for (var j = 0; j < Model.AllPages[i].actions.Count; j++ ) { %>
            <%= Html.CheckBoxFor(x => x.AllPages[i].actions[j].IsChecked) %>
            <%= Html.Label(Model.AllPages[i].actions[j].DisplayName) %>
        }
    </fieldset>
    <% } %>
    <input type="submit" value="save"/>
<% } %>

私のソリューションが機能し、あなたのソリューションが機能しない理由を理解するには、デフォルトのモデル バインダーがコレクションに使用する予想されるワイヤ形式についてお読みください。name次に、生成された HTML ソース コードを参照して、フォーム入力フィールドの生成された名前を確認します。チェックボックスの属性の根本的な違いがすぐにわかります。

また、モデル全体が POST アクションにバインドされることを期待しないでください。フォーム内の入力フィールドは 1 つだけです - チェックボックスです。これが、サーバーに送信され、モデルにバインドされる唯一の値です。他の値も必要な場合は、隠しフィールドとして含めることができます。

<!-- in the outer loop: -->
<% =Html.HiddenFor(x => x.AllPages[i].DisplayName) %>
...
<!-- and then in the inner loop -->
<%= Html.HiddenFor(x => x.AllPages[i].actions[j].ActionName) %>
<%= Html.HiddenFor(x => x.AllPages[i].actions[j].DisplayName) %>
... and so on ...

また、これらのループをビューに記述する代わりに、エディター テンプレートを使用することを強くお勧めします。入力フィールドの適切な名前を自動的に生成するので、心配する必要はありません。このトピックについては、無数の答えがあります。私の名前をグーグルでeditor templates asp.net mvc検索して検索に追加するだけで、多くの結果が得られるはずです。

于 2012-09-25T12:49:35.887 に答える