1

我有一个包含一大堆数据输入字段的表单,这些字段将由用户完成,包括一些元素,用户可以在这些元素中指示他们将输入多少相同的项目。这与 Phil Haack 的博客条目Model Binding To A List中使用的一样。

我成功地使用 JQuery 来创建额外的表单元素、正确索引等。我的问题是在我的控制器中实际读取这些元素的最佳方式。文章中的 Controller 只需要一个对象,IList<Product>而我的 Controller 已经需要一个对象,FormCollection form现在我也尝试发送它IList<Itmes>

我应该将其添加到控制器预期的参数中还是通过 form["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; };
}
4

3 回答 3

1

您可以像这样添加 myItem 作为参数:

public ActionResult Add(FormCollection form, List<Item> myItem)
{
}

然后它将自动从表单数据绑定并填充 myItem 参数。

于 2009-01-16T01:25:56.337 回答
1

我决定只使用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 )]
        });
}
于 2009-01-16T04:15:18.447 回答
-1

我还没有尝试过,所以你必须试一试,但为什么不使用 UpdateModel 或 TryUpdateModel 方法呢?这应该以与将 IList 传递给控制器​​的操作相同的方式进行绑定。

那是:

public ActionResult Add(FormCollection form)
{
    List<Item> items = new List<Item>();
    TryUpdateModel(items, form);
}

我不在我的开发计算机上,所以我不确定它是否会工作,但我希望它会。让我知道它是否是您需要的。

编辑:值得注意的是,如果您使用的是实体框架,我在 UpdateModel 方法中遇到了许多问题,因此不得不自己编写。

于 2009-01-16T11:47:28.530 回答