【问题标题】:ASP.NET MVC Controller return view model clarificationASP.NET MVC Controller 返回视图模型说明
【发布时间】:2012-07-14 00:35:12
【问题描述】:

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

返回模型

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

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-3 validation


    【解决方案1】:

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

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

    如果用户的数据正确并且您的操作成功(在这种情况下他已成功注册)您通常不会再次向他显示注册表单,但您会重定向 他进入成功页面。

    这是一个简单的example how to validate, show errors and redirect after successfull action

    您的代码示例:

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

    在注册视图上(如果没有 - 如果你有一个强类型视图,你可以使用 HTML Helper 重载 - 例如使用 Html.LabelFor、TextboxFor 等方法):

    显示一般错误消息/摘要;

    ...
    <%= Html.ValidationSummary("Register was not successfull") %>
    

    在输入旁边显示错误消息:

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

    【讨论】:

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

    你会在没有模型传递的情况下查看渲染吗?可能不会,所以第二个会失败。

    我建议您阅读Post Redirect Get模式

    http://en.wikipedia.org/wiki/Post/Redirect/Get

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        由于您有一个强类型视图,无论哪种情况,您都需要将相应的模型传递给视图(否则您的视图可能会在尝试访问空模型上的属性时崩溃)。成功后,您可以重定向到另一个页面,或者您应该能够在同一页面本身中向用户发送通知,更新操作是成功还是失败(取决于您是否想要通常的基于 HTML 的解决方案或启用 AJAX 的解决方案) .至于验证,有通常的客户端验证和基于 jQuery 的非侵入式客户端验证的选项。

        这里有几个有用的链接

        ASP.NET Model validation(这是基于 MVC2 但对于 MVC3 应该相同)

        MVC3 unobtrusive client validation

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-11
          • 2011-10-15
          • 2023-03-09
          • 2015-11-27
          • 2010-11-24
          • 1970-01-01
          相关资源
          最近更新 更多