如何将EditorFor与Grouped列表一起使用?

时间:2012-10-28 21:54:50

标签: c# asp.net-mvc razor

我有一个列表,我想在剃刀视图中进行分组和编辑。

如果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")]添加到我的操作中,现在只返回其中一个输入值。

我注意到生成的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">

1 个答案:

答案 0 :(得分: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 =&gt; groups [i])和@ Html.EditorFor(x =&gt; group)将在HTML中呈现不同的名称标签,因此模型绑定器不会将其识别为集合的一部分重建为行动的输入。