【问题标题】:Passing Controller a FormCollection and an IList<T>向控制器传递 FormCollection 和 IList<T>
【发布时间】:2009-01-16 00:51:53
【问题描述】:

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

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

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

【问题讨论】:

  • Scott Hanselman 有一个与此相关的blog post。 Phil Haack 的blog post 在发布列表时也非常有用(如原始问题中所述)。

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


【解决方案1】:

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

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

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

【讨论】:

  • 我会再试一次。我试过了,但一直收到“对象引用未设置为对象的实例”。错误所以假设如果我也使用 FormCollection,它不会自动绑定。
  • 太完美了!不可能更容易:)
【解决方案2】:

我决定只使用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 )]
        });
}

【讨论】:

    【解决方案3】:

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

    即:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 2012-05-28
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多