【问题标题】:ASP.NET MVC model binding an IList<> parameterASP.NET MVC 模型绑定 IList<> 参数
【发布时间】:2010-10-13 19:15:29
【问题描述】:

[我自己解决了这个问题,请查看我的答案]

我在正确设置控制器方法中获取 IList 参数的表单值时遇到问题。

我的控制器类如下所示:

public class ShoppingBasketController : Controller {

    public ActionResult Index() {
        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Add(IList<ShoppingBasketItem> items) {
        Session["basket"] = items; // for testing
        return RedirectToAction("Index");
    }
}
public class ShoppingBasketItem {
     public int ItemID;
     public int ItemQuantity;
}

略微修剪的表格:

<% using (Html.BeginForm("Add", "ShoppingBasket")) { %>
    <% int codeIndex = 0;
    foreach (Product product in products) { %>
        <%= Html.Hidden("items[" + codeIndex + "].ItemID", product.Id) %>
        <%= Html.TextBox("items[" + codeIndex + "].ItemQuantity", "0", new { size = "2"}) %>
        <% codeIndex++;
    }
} %>

这会产生如下标记:

<form action="/Basket/Add" method="post">
    <input id="items[0]_ItemID" name="items[0].ItemID" type="hidden" value="1" />
    <input id="items[0]_ItemQuantity" name="items[0].ItemQuantity" size="2" type="text" value="0" />

    <input id="items[1]_ItemID" name="items[1].ItemID" type="hidden" value="2" />
    <input id="items[1]_ItemQuantity" name="items[2].ItemQuantity" size="2" type="text" value="0" />

    <input id="items[2]_ItemID" name="items[2].ItemID" type="hidden" value="3" />
    <input id="items[2]_ItemQuantity" name="items[2].ItemQuantity" size="2" type="text" value="0" />
</form>

我检查了提交的表单值,它们是正确的。正确数量的ShoppingBasketItems 也被放入Session["basket"],但是ItemIDItemQuantity 都为零。它似乎正确解码了表单值列表,但没有获取属性本身。

我正在使用 MVC RC2,并且基于 article by Scott Hanselman 我很确定我的代码是正确的。我错过了什么吗?

【问题讨论】:

  • 有没有一种方法可以使用 UI 模板,对 Products 中的每次迭代使用 EditorFor(m => m.product)?
  • 谢谢。我发现这真的很有帮助。 :)

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


【解决方案1】:

解决方案

下载 MVC 源代码后,我仍然不明白为什么它不起作用,所以我推测它一定与我尝试绑定的类型有关。果然,与属性相反,成员变量的值是罪魁祸首。这是因为模型绑定器使用反射来设置属性,而它不是通过调用 TypeDescriptor.GetProperties(Type) 找到的。

将值类更新为此解决了它(经过数小时的撞墙后,我应该添加!!):

public class ShoppingBasketItem {
    public int ItemID { get; set; }
    public int ItemQuantity { get; set; }
}

【讨论】:

  • 我一直听说公共成员变量不是二进制等价于公共属性的(这是一个突破性的变化),现在我想我相信了。
  • 这是我找到的唯一完整的例子。所有其他博客文章都有整体情况。
  • 非常感谢!我在桌子上敲了好几个小时,试图找出问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多