【问题标题】:How do I get database validation among my rule violations on ASP.NET MVC?如何在 ASP.NET MVC 上的规则违规中获得数据库验证?
【发布时间】:2009-05-19 06:51:55
【问题描述】:

NerdDinner 示例中,编写了一组业务规则 来验证模型上的数据。检查空字符串之类的内容,并通过调用 modelObject.GetRuleViolations() 来获取所有内容。但是还有另一层验证是数据库。例如,datetime 字段留给数据库进行验证,它只接受可以转换为 DateTime 对象的字符串。

我看到的问题是 modelObject.GetRuleViolations() 永远不会返回日期时间的违规。因此,即使正确阻止保存记录并显示表单,指定存在错误并突出显示日期时间字段,也没有特定的错误消息。有没有办法在业务规则验证错误中获取数据库验证错误?

【问题讨论】:

    标签: asp.net-mvc database validation nerddinner


    【解决方案1】:

    您需要捕获数据访问层抛出的异常,并将它们转换为更新 ModelState 以指示有问题的错误的调用。在全局层面上并没有真正的好方法,因为特定的 SQL 错误只能在它们被调用时被解释,而不是以通用方式处理。

    【讨论】:

      【解决方案2】:

      我不记得来自 NerdDinner 的确切代码,尽管我看过它。但是,在我的应用程序中,我通常会在数据库中执行 raiserror('Some error',16,1) 并在我的控制器/模型中使用 try/catch,如下所示:

      public void DoSomething() 
      {
          try
          {
              // Some database activity
          } 
          catch (SqlException ex) 
          {
              ViewData["ErrorMessage"] = ex.Message;
          }
      }
      

      然后我可以在我的视图中呈现我想要的错误。

      【讨论】:

      • 一般来说,我会非常小心地盲目地将异常状态消息放入页面中以供最终用户查看,因为您可能会无意中提供有关数据库形状的非常敏感的信息。
      【解决方案3】:

      你的假设是错误的。日期时间字段不会在数据库上进行验证。

      在 NerdDinner/MVC 课程中我必须了解的一件事是,验证将在 Dinner.cs OnValidate() 部分方法和对 UpdateModel() 的调用中的 DinnersController.cs 中进行。此调用将文本从屏幕复制到模型中。例如,如果它尝试将文本复制到浮点数,或解析无效日期,它将更新 ModelState 并抛出错误。正常的验证不会运行。

      【讨论】:

        猜你喜欢
        • 2011-08-28
        • 2023-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-25
        • 2011-01-30
        • 1970-01-01
        • 2011-02-22
        相关资源
        最近更新 更多