1

かみそりビュー内でグループ化して編集したいリストがあります。

POCO が次の場合:

public class FooBar {

public string GroupName {get;set;}
public string SomeValue {get;set;}

// etc.

}

ビュー内のモデル:

@model IEnumerable<FooBar>

Post アクションは次のようになります。

[HttpPost]
        public ActionResult FooBarPost(IEnumerable<FooBar> model)

通常、リストを編集するには、ビューで次の構文を使用します。

@Html.EditorForModel()

これはうまく機能し、次のような素敵な小さな入力を作成します。

<input id="[0].SomeValue" />

そしてポストバックもバッチリ。

ここで、ビューをそれほど素晴らしいものに変更したい場合:

<fieldset>
                        <legend>Legendary</legend>
                        @foreach (var group in Model.GroupBy(x => x.GroupName))
                        {
                            <h3>@group.Key</h3>

                            @Html.EditorFor(x => group)
                        }
                    </fieldset>

次に、リストを投稿すると、リストが null として返されますか?

これを修正するためのトリックがあったことを覚えていますが、それが何であったか思い出せませんか?

ありがとう。

編集:

アクションに追加さ[Bind(Prefix="group")]れ、入力値の 1 つだけが返されます。

生成された HTML が次のようになっていることに気付きました (すべて同じページ上にあります)。

グループ 1:

<input id="group_0__SomeValue" name="group[0].SomeValues" type="hidden" value="bla">  
<input id="group_1__SomeValue" name="group[1].SomeValues" type="hidden" value="bla">

次のグループ:

<input id="group_0__SomeValue" name="group[0].SomeValues" type="hidden" value="bla">
4

1 に答える 1

1

GroupName の一意のインスタンスごとにエディターをレンダリングすることが目標であると仮定すると、コードを次のように変更します。

@model IEnumerable<PlayMvc.Models.FooBar>
<fieldset>
    <legend>Legendary</legend>
    @using(Html.BeginForm("Test","Home", FormMethod.Post)){
        var groups = Model.GroupBy(x => x.GroupName).Select(x => x.First()) .ToList();
        for (int i = 0; i < groups.Count(); i++ )
        {
            <h3>@groups[i].GroupName</h3>

            @Html.EditorFor(x => groups[i])
        }
        <input type="submit" />
    }
</fieldset>

コントローラー側で次のようにします。

public ActionResult Test([Bind(Prefix="groups")]List<FooBar> model)

サイドノート

列挙型を操作してビュー内のアイテムをレンダリングしようとする場合は、foreach を使用しないでください。そうしないと、名前にインデクサーが含まれません。@Html.EditorFor(x => groups[i]) と @Html.EditorFor(x => group) は HTML で異なる名前タグをレンダリングするため、モデル バインダーはそれを再構築する必要があるコレクションの一部として認識しません。アクションの入力。

于 2012-10-28T22:55:57.617 に答える