C# 在MVC中,使用UpdateModel vs Request.Form集合编辑操作{HTTPPOST}
我正在学习示例MVC教程,并在AdventureWorks数据库上使用它。我在CategoryController中创建了一个编辑操作,用于编辑AdventureWorks中的产品类别。此表中唯一可更新的字段是名称(其他字段-ID、RowGUID和UpdateDate是自动生成的)。因此,我的编辑表单视图只有一个名称字段(产品类别)。我的编辑“保存”操作如下:-C# 在MVC中,使用UpdateModel vs Request.Form集合编辑操作{HTTPPOST},c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我正在学习示例MVC教程,并在AdventureWorks数据库上使用它。我在CategoryController中创建了一个编辑操作,用于编辑AdventureWorks中的产品类别。此表中唯一可更新的字段是名称(其他字段-ID、RowGUID和UpdateDate是自动生成的)。因此,我的编辑表单视图只有一个名称字段(产品类别)。我的编辑“保存”操作如下:- [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(int
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection collection){
ProductCategory p = awRepository.GetProductCategory(id);
try
{
//UpdateModel(p);
p.Name = Request.Form["Name"];
awRepository.Save();
return RedirectToAction("Details", new { id = p.ProductCategoryID });
}
catch
{
foreach (var err in p.GetRuleViolations())
{
ModelState.AddModelError(err.PropertyName, err.ErrorMessage);
}
return View(p);
}
}
如果我使用上面的代码,只要输入的名称有效,一切都可以工作(因此没有例外)。如果我引入了一个错误(如果名称为空或出于测试目的是一个特定的“测试”字符串,则由GetRuleViolations引发),则在重新绘制编辑视图时,我会在视图(Category/Edit.aspx)的此行上得到一个NullReferenceException(对象引用未设置为对象的实例)(向用户显示错误并允许其更正)
如果我使用UpdateModel(p)而不是Request.Form变量更新ProductCategory,则一切正常;有效数据将被保存,无效数据将重新绘制显示错误消息的视图
我的问题是:UpdateModel和通过读取Request.Form集合中的值手动更新我的变量之间有什么区别?Nerbinent教程似乎建议两者是等效的。所以我很惊讶其中一个工作顺利,而另一个引发了一个异常。听起来像这样:
因此,对于您添加的每个错误
AddModelError()并调用
再次查看,MVC框架将尝试
为每个
它发现错误。因为您没有添加
MVC将抛出一个异常
通常您不需要添加这些
值:尝试的值为
使用时自动填充
DefaultBinding(通过调用
UpdateModel()或通过传递对象
要绑定为操作方法参数,请执行以下操作:
公共行动结果
创建(FormCollection)表格,
YourObjectType yourObject)
看起来以下操作是由UpdateModel自动完成的,而不是由您自己手动完成的
if (Form["Name"].Trim().Length == 0)
{
ModelState.AddModelError("Name", "Name is required");
//You missed off SetModelValue?
ModelState.SetModelValue("Name", Form.ToValueProvider()["Name"]);
}
是的,当我这样做的时候,我还必须设置模型值。此后,我开始使用DataAnnotation在自定义视图模型上提供大部分这种逻辑。
if (Form["Name"].Trim().Length == 0)
{
ModelState.AddModelError("Name", "Name is required");
//You missed off SetModelValue?
ModelState.SetModelValue("Name", Form.ToValueProvider()["Name"]);
}