我有一个表单,其中包含一大堆数据输入字段,这些字段将由用户完成,包括一些元素,用户可以指定他们将输入多少相同的项目。这与Phil Haack的博客文章Model Binding To A List中使用的一样。
我成功使用JQuery创建额外的表单元素,正确编制索引等。我的问题是在我的Controller中实际读取这些内容的最佳方法。文章中的控制器只需要一个对象IList<Product>
,而我的控制器已经预期FormCollection form
,现在我也尝试发送IList<Itmes>
。
我应该将此添加到Controller预期的参数中还是通过表单[“items”]或其他方式访问?
查看
<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; };
}
答案 0 :(得分:1)
您可以将myItem添加为参数,如下所示:
public ActionResult Add(FormCollection form, List<Item> myItem)
{
}
然后它将自动从表单数据绑定并填充myItem参数。
答案 1 :(得分:1)
我已决定专门使用FormCollection
而不是混淆水域,一些数据通过使用FormCollection
传递,其他数据通过框架映射到List。以下代码采用物品并手动水合DTO。这很好用,并允许我在我的代码中做一些其他不可能直接映射到List的东西。
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 )]
});
}
答案 2 :(得分:-1)
我没试过这个,所以你不得不试一试,但为什么不使用UpdateModel或TryUpdateModel方法呢?这应该与将IList传递给控制器的操作的方式相同。
那是:
public ActionResult Add(FormCollection form)
{
List<Item> items = new List<Item>();
TryUpdateModel(items, form);
}
我不在我的开发计算机上,所以我不确定它是否会起作用,但我希望它能。如果这是你需要的,请告诉我。
编辑:值得注意的是,如果您使用实体框架,我遇到了许多UpdateModel方法的问题,并且已经编写了自己的问题。