TryUpdateModel不起作用

时间:2010-07-14 01:20:16

标签: asp.net asp.net-mvc-2

我正在关注专业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获取值,然后用它更新晚餐对象,我没有看到集合被引用到任何地方。

感谢您的帮助,我一直在试图解决过去的房子问题。

2 个答案:

答案 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集合以查看要发布的数据。