传递控制器a formcollection和iList
-
19-08-2019 - |
题
我有一个包含用户将完成的整体数据输入字段的表单,其中包括用户可以决定将输入多少相同项目的一些元素。这是在Phil Haack的博客条目中使用的 模型结合到列表.
我成功地使用jQuery创建了额外的表单元素,正确索引等等。我的问题是在控制器中实际读取这些元素的最佳方法。本文中的控制器仅期望一个对象, IList<Product>
而我的控制器已经期望 FormCollection form
现在,我也试图将其发送给 IList<Itmes>
也是。
我应该将其添加到控制器期望的参数或通过表单[“项目”]或其他内容访问的参数?
看法
<form action="/MyItems/Add" method="post">
<input type="text" name="Title" value="" />
<input type="hidden" name="myItem.Index" value="0" />
<input id="item[0].Amount" name="item[0].Amount" type="text" value="" />
<input id="item[0].Name" name="item[0].Name" type="text" value="" />
<input type="hidden" name="myItem.Index" value="1" />
<input id="item[1].Amount" name="item[1].Amount" type="text" value="" />
<input id="item[1].Name" name="item[1].Name" type="text" value="" />
</form>
控制器
public ActionResult Add(FormCollection form)
{
string Title = form["Title"];
List<Item> Items = form["items"].ToList();
}
DTO
public class Item()
{
int Amount {get; set; };
string Name {get; set; };
}
解决方案 2
我决定专门与 FormCollection
而不是用一些数据通过使用的数据使水混乱 FormCollection
以及其他数据映射到列表的框架。以下代码将项目取用并手动补充DTO。这很好地工作,让我可以在代码中执行其他一些直接映射到列表的事情。
List<Item> itemList = new List<Item>();
int i = 0;
while ( form["item[" + i + "].Amount"] != null)
{
itemList.Add(new Item()
{
Amount = Convert.ToInt32(form[String.Format("item[{0}].Amount",i )]),
Name = form[String.Format("item[{0}].Name",i )]
});
}
其他提示
您可以将MyItem添加为类似的参数:
public ActionResult Add(FormCollection form, List<Item> myItem)
{
}
然后,它将从表单数据自动绑定并填充MyItem参数。
我没有尝试过,所以您必须尝试一下,但是为什么不使用UpdateModel或TryupDateModel方法呢?这应该以与将iList进入控制器的动作相同的方式绑定。
那是:
public ActionResult Add(FormCollection form)
{
List<Item> items = new List<Item>();
TryUpdateModel(items, form);
}
我不在开发计算机上,所以我不确定它会起作用,但我希望它应该。让我知道您是否需要。
编辑:值得注意的是,如果您正在使用实体框架,我遇到了UpdateModel方法的许多问题,并且已经求助于我自己的编写。
不隶属于 StackOverflow