我正在研究我的第一个.NET MVC应用程序并使用NerdDinner教程作为参考点。目前令我着迷的一点是UpdateModel()
方法。 (我不喜欢使用我不太懂的东西。)
//
// 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()
如何访问Edit方法中传递的formValues?为什么集合没有作为参数显式传递给方法?
答案 0 :(得分:28)
UpdateModel()是一个Controller辅助方法,它尝试将一堆不同的输入数据源(来自View,QueryString值,会话变量/ Cookie等的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到SQL之类的东西)会使所有这一切都没有用,因为它可以将强类型对象和派生对象与自己的方法联系起来。
答案 1 :(得分:4)
它会检查所有HttpRequest输入,例如Form,QueryString,Cookies和Server变量。我想按此顺序。
答案 2 :(得分:1)
我们不是将模型对象作为参数传递给“ Post()”操作方法,而是在“ Post()”函数中创建Model对象的实例,并使用“ UpdateModel()”函数对其进行更新。 “ UpdateModel()”函数检查所有HttpRequest输入,例如发布的表单数据,QueryString,Cookie和Server变量,并填充雇员对象。
例如
[HttpPost]
[ActionName("Create")]
public ActionResult Create_Post()
{
EmployeeBusinessLayer employeeBusinessLayer =
new EmployeeBusinessLayer();
Employee employee = new Employee();
UpdateModel(employee);
employeeBusinessLayer.AddEmmployee(employee);
return RedirectToAction("Index");
}