我正在关注专业ASP.Net MVC 2中的示例,其中一个示例对我不起作用。
[HttpPost]
public ActionResult Edit (int id, FormCollection collection)
{
Dinner dinner = dinnerRepository.GetDinner(id);
if (TryUpdateModel(dinner))
{
dinnerRepository.Save();
return RedirectToAction("Details", new { id = dinner.DinnerID });
}
return View(new DinnerFormViewModel(dinner));
}
我理解它假设从FormCollection获取值,然后用它更新晚餐对象,我没有看到集合被引用到任何地方。
感谢您的帮助,我一直在试图解决过去的房子问题。
答案 0 :(得分:1)
解决您对collection
未被引用的担忧。
TryUpdateModel
是执行模型绑定的基类Controller
类方法。这个过程涉及很多,但基本上它解析请求值(查询字符串,发布变量,cookie等)并将它们与传递给TryUpdateModel
的对象的属性进行匹配。
严格地说,动作方法的FormCollection
参数不是必需的。 TryUpdateModel
应该没有它。
答案 1 :(得分:1)
TryUpdateModel()方法有几个重载。您正在使用的TryUpdateModel< TModel>(TModel模型)方法尝试更新从默认IValueProvider(它是包含FormValueProvider,RouteDataValueProvider,QueryStringValueProvider和HttpFileCollectionValueProvider实例的ValueProviderCollection的实例)传入的模型对象。 FormCollection类型是一个NameValueCollection,它带有自己的CustomModelBinderAttribute,它只从Form数据绑定(即不是路由数据,查询字符串等)。就目前而言,你的方法没有对这个集合做任何事情。
您可以在FormCollection中传递另一个TryUpdateModel()重载(因为FormCollection实现了IValueProvider)作为第二个参数,它将从表单数据更新模型(如果有任何数据)。如果你的例子当前没有工作,那么可能还有别的东西是不对的,比如没有数据被发布等等。任何表格数据也会从默认的IValueProvider获得,所以如果你没有得到你期望的数据,传入FormCollection实例是没有用的。您可以考虑在操作方法的开头放置一个断点,并检查HttpContext.Request.Form集合以查看要发布的数据。