将Controller传递给FormCollection和IList <t> </t>

时间:2009-01-16 00:51:54

标签: .net asp.net-mvc asp.net-mvc-2

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

3 个答案:

答案 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方法的问题,并且已经编写了自己的问题。