在MVC表单上发送多个实体提交

时间:2014-08-22 20:04:59

标签: c# asp.net-mvc forms entities

我能够将视图返回给具有实体列表的用户,但在该视图中,我希望有一个表单,其中每个实体都可以单独编辑,当用户提交表单时,我将收回所有实体。

addresses = entities.Addresses.Where(m => m.CountryId == null);
return View(addresses);

这会将所有项目带入我使用

管理的视图中
@foreach (var item in Model) {

我的问题是,我不知道从表单提交中形成一个动作结果的开始位置,并将所有项目(和更改)带回来。我可以使用视图中的1个单独项目轻松完成此操作,但是当我有一个列表时,我会感到难过。

由于

1 个答案:

答案 0 :(得分:0)

如果您正在使用直接MVC,那么由于表单元素的限制,执行批量更新操作会变得非常繁琐。以下是您可以做的事情的粗略草图:

<form action="/mypage">
@foreach(var item in Model) {
   <input type="text" name="property1-@item.uniqueID" />
   <input type="text" name="property2-@item.uniqueID" />
}
</form>

这种方法很麻烦,因为当回发到你的action方法时,MVC的默认模型绑定不够聪明,不能将property1和property2与某种列表中的同一个对象关联起来,而你&#39 ; ll可能必须通过浏览HttpContext.Request.Form集合中的表单字段来手动完成。

使用JSON和一些javascript可以使这变得更容易,但结果却使一些客户端代码变得混乱。考虑:

<form action="/mypage">
<input type="hidden" 
    name="itemsSerialized" 
    value="JsonConvert.Serialize(Model.Items)" />
@foreach(var item in Model.Items) {
   <input type="text" name="property1-@item.uniqueID" />
   <input type="text" name="property2-@item.uniqueID" />
}
</form>
<script type="text/javascript">
    // write some js code that every time an input is modified for a property, 
    // update the serialized string in the itemsSerialized hidden input
</script>

第二种方法的优点是你的动作方法变得简单得多,它需要(List<Item> itemsSerialized)作为参数,而MVC模型绑定应该足够聪明才能正确地将它变成一个列表。

第二个优点是,您可能会将其转换为基于API的ajax页面,而不是依赖于POSTS,如果这是您最终想要的。