2009-07-06 102 views
24

我正在处理我的第一个.NET MVC应用程序,并使用NerdDinner教程作为参考点。目前有趣的一点是UpdateModel()方法。 (我不喜欢使用的事情,我真的不明白。)ASP.NET MVC UpdateModel()方法是如何工作的?

NerdDinner tutorial两者 -

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int id, FormCollection formValues) { 

    Dinner dinner = dinnerRepository.GetDinner(id); 

    UpdateModel(dinner); 

    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = dinner.DinnerID }); 
} 

我的主要问题是如何在UpdateModel()可以访问的编辑方法通过formValues ?为什么集合没有作为参数传递给方法?

+0

我会从Microsoft获得[ASP.NET MVC源代码](http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&displaylang=en),并使用即步骤通过您的代码。然后你将能够看到他们正在做什么魔术:-) – mkchandler 2009-07-06 14:40:54

+0

它只能用于表单收集场景或其他吗? – Krish 2016-08-04 15:19:23

回答

3

它检查所有的HttpRequest输入,如Form,QueryString,Cookies和Server变量。我按照这个顺序思考。

+0

`UpdateModel函数`只适用于表单集合场景或其他? – Krish 2016-08-04 15:21:48

24

UpdateModel()是一个控制器帮助器方法,它试图将一堆不同的输入数据源(来自View,QueryString值,Session变量/ Cookies等的HTTP POST数据)绑定到您指定的显式模型对象作为参数。实质上,它只适用于模型绑定。

如果您将Action的输入参数表示为强类型模型(如视图模型),那么当调用UpdateModel()时,您已经完成了在幕后完成的所有步骤。如果您从DataContext中检索对象并编辑其属性,则只需将SaveChanges()更新回数据库(在本例中为Save())即可。

例子:

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(DinnerViewModel incoming) { 

    var dinner = dinnerRepository.GetDinner(incoming.DinnerID); 
    dinner.Description = incoming.Description; 
    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = incoming.DinnerID }); 
} 

然而,有一个用例使用的UpdateModel()有一个强类型的模型:当你传递一个强类型的模型,并希望它的值直接替换数据库中的实体(只要它们的名称和输入都相同)即可。在这种情况下,您将检索该对象,对其使用UpdateModel(),并且其模型绑定操作将从强类型对象中提取任何类似名称和类型的属性到检索的对象。换句话说,它会为您执行反射。因此,就像你的例子,如果你想要所有的属性更新而不指定更新,而你的强类型模型和数据库模型具有相似命名的属性,你仍然想使用UpdateModel()来利用的反思。

例子:

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(DinnerViewModel incoming) { 

    var dinner = dinnerRepository.GetDinner(incoming.DinnerID); 
    UpdateModel(dinner); 
    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = incoming.DinnerID }); 
} 

这里(在使用的FormCollection对象)唯一的好处是,你可以访问强类型对象的所有其他属性(如图incoming.DinnerID)。

结论:如果您正在将强类型对象转换为派生对象,那么最好使用UpdateModel()。但是,如果您只是更新派生对象的一些属性,则基本上没有必要。此外,请注意,使用实体框架(而不是像Linq to SQL之类的东西)使得所有这些都毫无意义,因为它可以将强类型对象和派生对象与自己的方法联系起来。