2010-07-14 47 views
0

虽然专业ASP.Net MVC 2中的例子,但我的例子之一不适用于我。TryUpdateModel不起作用

[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

您能描述一下您遇到的实际问题吗?是否有例外,晚餐没有更新等? – 2010-07-14 01:28:41

+0

虽然更新没有进行。它只显示旧数据的视图。 – PBG 2010-07-14 02:12:08

回答

1

为了解决您关注的collection未被引用的任何地方。

TryUpdateModel是执行模型绑定的基类Controller类方法。这个过程中涉及到很多,但基本上它解析请求值(查询字符串,变量后,饼干等)并将它们匹配到传递给TryUpdateModel的对象的属性。

严格来说,FormCollection参数给action方法是没有必要的。 TryUpdateModel应该没有它。

1

TryUpdateModel()方法有几个重载。您正在使用的TryUpdateModel TModel>(TModel模型)方法尝试更新从默认IValueProvider(它是包含FormValueProvider,RouteDataValueProvider,QueryStringValueProvider和HttpFileCollectionValueProvider的实例的ValueProviderCollection的实例)传入的模型对象。    这个FormCollection类型是一个NameValueCollection,它带有它自己的CustomModelBinderAttribute,它只能从Form数据绑定(即不包含路由数据,查询字符串等)。就目前而言,你的方法对这个集合没有任何作用。

还有另一个TryUpdateModel()的重载,您可以在FormCollection中传递(因为FormCollection实现了IValueProvider)作为第二个参数,它将从表单数据(如果有数据的话)更新模型。如果你的例子目前还没有正常工作,那么很可能是别的东西是不合适的,比如没有发布数据等等。任何表单数据也会从默认的IValueProvider中获得,所以如果你没有得到你期望的数据,在FormCollection实例中传递不会有帮助。您可能会考虑在操作方法的开始处设置一个中断点,并检查HttpContext.Request.Form集合以查看要发布的数据。