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

本文关键字:实体 MVC 表单提交 | 更新日期: 2023-09-27 18:19:05

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

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

这将把所有项目带入我用

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

我的问题是,我不知道从哪里开始形成一个由表单提交触发的操作结果,并将所有项目(和更改)带回来。我可以很容易地做到这一点,在一个视图上只有一个项目,但当我有一个列表时,我就难住了。

谢谢

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

如果直接使用MVC,那么由于表单元素的限制,进行批处理更新操作将变得相当麻烦。这里有一个你可以做的事情的草图:

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

这种方法是混乱的,因为当张贴回你的动作方法,MVC的默认模型绑定不会聪明到足以将property1和property2与相同的对象在某种类型的列表,你可能不得不做手工通过在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。