2

我将 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 方法上有一个断点来检查我得到了什么。

4

3 回答 3

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>
<% } %>
于 2009-10-15T15:40:25.023 回答
0

这不起作用的原因是因为默认模型绑定器不知道您要将每个表单元素放入 IEnumerable。

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

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

于 2009-10-15T13:18:29.490 回答
0

我想知道复杂类型的数组是否可以在没有活页夹的情况下工作,您可以尝试制作它:

Public ActionResult AddItems(Item[] items)
于 2009-10-15T13:21:42.463 回答