绑定 IList<> 的 ASP.NET MVC 模型 范围
[我自己解决了这个问题,请参阅我的答案以了解原因]
我在获取 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"
] 中,但是 ItemID
和 ItemQuantity
> 每个都为零。 它似乎正确解码了表单值列表,但没有获取属性本身。
我正在使用 MVC RC2,并且基于 Scott Hanselman 的文章 我很漂亮确保我的代码是正确的。 我错过了什么吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
解决方案
下载 MVC 源代码后,我仍然不明白为什么它不起作用,所以我推测它一定与我尝试绑定的类型有关。 果然,罪魁祸首是作为成员变量的值,而不是属性。 这是因为模型绑定程序使用反射来设置属性,而它没有通过调用
TypeDescriptor.GetProperties(Type)
找到这些属性。将值类更新为此解决了这个问题(经过几个小时的努力,我应该添加!!):
Solution
After downloading the MVC source I still couldn't see why it wouldn't work, so I presumed it must be something to do with the type I was attempting to bind. Sure enough, the values being member variables, as opposed to properties, was the culprit. This is because the model binder uses reflection to set properties, which it wasn't finding through the call to
TypeDescriptor.GetProperties(Type)
.Updating the value class to this solved it (after hours of hitting head off wall I should add!!):