ASP.NET绑定到IEnumerable

时间:2009-10-15 13:11:00

标签: asp.net asp.net-mvc postback model-binding

我将IEnumerable类型传递给我的视图,并为每个项目输出一个html.textbox来输入详细信息。

当我将其发回给我的控制器时,该集合是空的,我看不出原因。

    public class Item
    {
        public Order Order { get; set; }
        public string Title { get; set; }
        public double Price { get; set; }
    }

我的获取方法:

public ActionResult AddItems(Order order)
    {
        Item itemOne = new Item
        {
            Order = order
        };

        Item itemTwo = new Item
        {
            Order = order,
        };

        IList<Item> items = new List<Item> { itemOne, itemTwo };

        return View(items);
    }

观点:

            <% int i = 0; foreach (var item in Model)
           { %>

            <p>
                <label for="Title">Item Title:</label>
                <%= Html.TextBox("items[" + i + "].Title") %>
                <%= Html.ValidationMessage("items[" + i + "].Title", "*")%>
            </p>
            <p>
                <label for="Price">Item Price:</label>
                <%= Html.TextBox("items[" + i + "].Price") %>
                <%= Html.ValidationMessage("items[" + i + "].Price", "*")%>
            </p>

        <% i++;
           } %>

POST方法:

 [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult AddItems(IEnumerable<Item> items)
    {
        try
        {

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

目前我只是在post方法上有一个断点来检查我要回来的东西。

3 个答案:

答案 0 :(得分:1)

尝试添加此内容:

<input type="hidden" name="items.Index" value="<%=i%>" />

<强>此外...

我冒昧地改变了 for 循环的方式,这样你就不再需要在代码中进行递增了,因为我总觉得这有点令人费解。这意味着您将当前项目称为:

<%= item.Current %>

然后使用以下命令访问循环的当前索引:

<%= item.Index %>

所以你的观点看起来像这样(虽然你似乎永远不会使用当前项目,只是它的索引):

<% foreach(var item in Model.Select((x, i) => new { Current = x, Index = i }) { %>
  <p>
    <label for="Title">Item Title:</label>
    <input type="hidden" name="items.Index" value="<%= item.Index %>" />
    <%= Html.TextBox("items[" + item.Index + "].Title") %>
    <%= Html.ValidationMessage("items[" + item.Index + "].Title", "*")%>
  </p>
  <p>
    <label for="Price">Item Price:</label>
    <%= Html.TextBox("items[" + item.Index + "].Price") %>
    <%= Html.ValidationMessage("items[" + item.Index + "].Price", "*")%>
  </p>
<% } %>

答案 1 :(得分:0)

这不起作用的原因是因为默认模型绑定器没有线索要将每个表单元素放入IEnumerable中。

您必须使您的AddItems Post方法中的模型与默认模型绑定器的表单元素匹配才能正确放入数据。

或者,您可以直接通过Form变量处理它。

答案 2 :(得分:0)

我想知道复杂类型的数组是否适用于你可以尝试制作它的绑定器:

Public ActionResult AddItems(Item[] items)