ASP.NET MVC模型绑定IList<>参数

时间:2009-03-17 09:26:04

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

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

我无法获取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>

我已经检查了提交的表单值并且它们是正确的。正确的ShoppingBasketItem个数也会被放入Session["basket"],但每个ItemIDItemQuantity都为零。它似乎正确解码了表单值列表,但没有自己获取属性。

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

1 个答案:

答案 0 :(得分:35)

<强>解决方案

下载MVC源后,我仍然无法理解为什么它不起作用,所以我认为它必须与我试图绑定的类型有关。果然,价值是成员变量,而不是属性,是罪魁祸首。这是因为模型绑定器使用反射来设置属性,而这些属性是通过调用TypeDescriptor.GetProperties(Type)找不到的。

将值类更新为此解决了这个问题(在撞墙后几小时我应该添加!!):

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