我有一个包含用户将完成的整体数据输入字段的表单,其中包括用户可以决定将输入多少相同项目的一些元素。这是在Phil Haack的博客条目中使用的 模型结合到列表.

我成功地使用jQuery创建了额外的表单元素,正确索引等等。我的问题是在控制器中实际读取这些元素的最佳方法。本文中的控制器仅期望一个对象, IList<Product> 而我的控制器已经期望 FormCollection form 现在,我也试图将其发送给 IList<Itmes> 也是。

我应该将其添加到控制器期望的参数或通过表单[“项目”]或其他内容访问的参数?

看法

<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; };
}
有帮助吗?

解决方案 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 )]
        });
}

其他提示

您可以将MyItem添加为类似的参数:

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

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

我没有尝试过,所以您必须尝试一下,但是为什么不使用UpdateModel或TryupDateModel方法呢?这应该以与将iList进入控制器的动作相同的方式绑定。

那是:

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

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

编辑:值得注意的是,如果您正在使用实体框架,我遇到了UpdateModel方法的许多问题,并且已经求助于我自己的编写。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top