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>

然后当我发布我的列表时返回为空?

我记得有一个技巧可以解决这个问题,我只是不记得是什么?

谢谢。

编辑:

添加[Bind(Prefix="group")]到我的操作中,现在只带回一个输入值。

我注意到生成的 HTML 看起来像这样(都在同一页面上):

第一组:

<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 回答