传递控制器一个FormCollection和一个IList
我有一个表单,其中包含一个完整的数据输入字段的堆,将由用户完成,包括一些元素,用户可以指定他们将输入多少相同的项目。这正如Phil Haack的博客文章Model Binding To A List中所使用的那样。传递控制器一个FormCollection和一个IList <T>
我成功地使用JQuery来创建额外的表单元素,正确索引,等我的问题是实际阅读我的控制器内的这些最好的方法。本文中的控制器只需要一个对象,即,而我的控制器已经期望FormCollection form
,现在我正在尝试将其也发送给IList<Itmes>
。
我应该将此添加到控制器所期望的参数还是通过表单[“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; };
}
我决定与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)]
});
}
你可以只添加myItem为p像这样的参数:
public ActionResult Add(FormCollection form, List<Item> myItem)
{
}
然后,它将自动从表单数据绑定并填充myItem参数。
我会给另一个去。我试过,但不断得到一个“对象引用未设置为对象的实例。”错误,所以假定它不会自动绑定,如果我也使用FormCollection。 – dave 2009-01-16 01:44:01
我没有试过这个,所以你必须给它一个去,但为什么不使用UpdateModel或TryUpdateModel方法?这应该与将IList传递给控制器的操作相同。
即:
public ActionResult Add(FormCollection form)
{
List<Item> items = new List<Item>();
TryUpdateModel(items, form);
}
我不是在我的开发计算机,所以我不知道它会工作,但我相信它应该。让我知道,如果这是你需要的。
编辑:值得注意的是,如果您使用的是实体框架,我遇到了UpdateModel方法的许多问题,并诉诸写我自己的。
Scott Hanselman与此相关的[博客文章](http://*.com/questions/449138/passing-controller-a-formcollection-and-an-ilistt/450176#450176)。 Phil Haack的[博客文章](http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx)在发布列表时也非常有用(正如原始问题中提到的那样)。 ) – 2010-09-09 02:38:25