代码之家  ›  专栏  ›  技术社区  ›  roryf

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

  •  27
  • roryf  · 技术社区  · 15 年前

    [我自己解决了这个问题,看到我的答案是有原因的]

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

    我的控制器类如下:

    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 S也被投入 Session["basket" ]但是,两个 ItemID ItemQuantity 每个都是零。它似乎正确地解码了表单值列表,但没有提取属性本身。

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

    1 回复  |  直到 15 年前
        1
  •  35
  •   roryf    15 年前

    解决方案

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

    更新值类到这个解决了它(几个小时后撞头墙,我应该添加!!)

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