在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,那么由于表单元素的限制,进行批处理更新操作将变得相当麻烦。这里有一个你可以做的事情的草图:
<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模型绑定应该足够聪明,正确地把它变成一个列表。