传递控制器一个FormCollection和一个IList

传递控制器一个FormCollection和一个IList <T>

问题描述:

我有一个表单,其中包含一个完整的数据输入字段的堆,将由用户完成,包括一些元素,用户可以指定他们将输入多少相同的项目。这正如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; }; 
} 
+0

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

我决定与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参数。

+0

我会给另一个去。我试过,但不断得到一个“对象引用未设置为对象的实例。”错误,所以假定它不会自动绑定,如果我也使用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方法的许多问题,并诉诸写我自己的。