Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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# ASP.NET MVC控制器返回视图模型说明_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 3_Validation - Fatal编程技术网

C# ASP.NET MVC控制器返回视图模型说明

C# ASP.NET MVC控制器返回视图模型说明,c#,asp.net,asp.net-mvc,asp.net-mvc-3,validation,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Validation,以下是用于提交数据的控制器的两个示例。如果验证失败,一个返回输入模型,另一个则不返回。有人能告诉我哪种方法是正确的还是首选的吗?他们的行为似乎完全一样 回归模型 [HttpPost] public ActionResult Register(RegisterModel model) { if (ModelState.IsValid) { //do stuff } return View(model

以下是用于提交数据的控制器的两个示例。如果验证失败,一个返回输入模型,另一个则不返回。有人能告诉我哪种方法是正确的还是首选的吗?他们的行为似乎完全一样

回归模型

    [HttpPost]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
    //do stuff
        }


        return View(model);
    }
    [HttpPost]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
    //do stuff
        }


        return View();
    }
不返回模型

    [HttpPost]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
    //do stuff
        }


        return View(model);
    }
    [HttpPost]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
    //do stuff
        }


        return View();
    }

您是否可以在不向其传递模型的情况下查看渲染?可能不会,所以第二个会失败

我建议您阅读有关后重定向获取模式的内容


通常,如果用户提交的数据无效,您希望用户显示错误消息(例如,他没有在要求为电子邮件的字段中输入有效的电子邮件地址-有关更多信息,请参阅MVC ModelValidation)

您可以使用ModelState.IsValid来检查这一点。在这种情况下,您通常向他显示他来自的页面(“Register”),并且您还希望显示他在表单字段(=RegisterModel)中输入的数据。但是您希望显示一条错误消息,告诉他哪些字段不正确

如果用户的数据正确并且您的操作成功(在本例中,他已成功注册),您通常不会再次向他显示注册表,但您会将他重定向到成功页面

这里有一个简单的例子

代码中的示例:

[HttpPost]
public ActionResult Register(RegisterModel model)
{
    if (ModelState.IsValid)
    {
       //do stuff
       // redirect to a success page
       return RedirectToAction("Success");
    }

    // data is not valid - show the user his data and error messages
    // using Html Helper methods (see link for details)
    return View(model);
}
在Register视图上(如果没有-如果您有强类型视图,可以使用HTML帮助器重载-例如,使用HTML.LabelFor、textboxforetc方法):

显示一般错误消息/摘要

...
<%= Html.ValidationSummary("Register was not successfull") %>
。。。
在输入旁边显示错误消息:

...
<%= Html.TextBox("Email") %>
<%= Html.ValidationMessage("Email", "*") %>
。。。

最后的第一个动作是将模型传递给视图,第二个动作返回空视图。所以我建议你选择第一个

但是当验证失败时,您应该以这种方式进行错误处理

if (ModelState.IsValid)
        {
    //do stuff
        }
   else
   {
      ModelState.AddModelError("RegisterModel Errors", "some error occured");
   } 

       return View(model);

由于您有一个强类型视图,在任何一种情况下,您都需要将相应的模型传递给该视图(否则您的视图可能会在尝试访问空模型的属性时崩溃)。成功后,您可以重定向到另一个页面,或者应该能够向用户发出通知,在同一个页面中更新操作是成功还是失败(取决于您想要的是基于HTML的普通解决方案还是支持AJAX的解决方案)。至于验证,有常用的客户端验证和基于jQuery的不引人注目的客户端验证

这里有几个有用的链接

(这是基于MVC2的,但应与MVC3相同)


“模型”是用户提交的输入,我们能相信它吗?如果其中有恶意字符串,并且由于它失败了ModelState.IsValid,那么显示是否安全?这就是我发布这个问题的方式。永远不要相信用户的输入。IsValid不会检查userinput是否包含sql注入攻击或类似的攻击。它只是验证数据类型是否正确(例如,用户是否为int属性输入一个数字等)和其他验证(使用属性等),例如格式验证、最小-最大值等。如果要进一步处理数据,必须确保安全使用数据(html编码、使用参数化sql等)。Isvalid无法检查此项,因为它不知道您将如何处理数据;但是,如果调用returnview(),也会产生相同的效果;您提供的链接使用return View()技术。问题是视图如何获取模型并显示有效的错误信息,以及在返回视图()的情况下显示该数据;叫什么名字?