Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVC中,使用UpdateModel vs Request.Form集合编辑操作{HTTPPOST}_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

C# 在MVC中,使用UpdateModel vs Request.Form集合编辑操作{HTTPPOST}

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

我正在学习示例MVC教程,并在AdventureWorks数据库上使用它。我在CategoryController中创建了一个编辑操作,用于编辑AdventureWorks中的产品类别。此表中唯一可更新的字段是名称(其他字段-ID、RowGUID和UpdateDate是自动生成的)。因此,我的编辑表单视图只有一个名称字段(产品类别)。我的编辑“保存”操作如下:-

    [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"]); 
}