我有一个列表,我想在剃刀视图中进行分组和编辑。
如果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">
答案 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中呈现不同的名称标签,因此模型绑定器不会将其识别为集合的一部分重建为行动的输入。