2009-05-19 72 views
2

NerdDinner示例中,编写了一组业务规则以验证模型上的数据。通过调用modelObject.GetRuleViolations()检查像空字符串这样的东西,你可以得到它们全部。但还有另一层验证是数据库。例如,datetime字段留给数据库验证,数据库只接受可以转换成DateTime对象的字符串。如何在ASP.NET MVC的规则违规中获得数据库验证?

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

回答

2

您需要捕获数据访问层引发的异常,并将其转换为更新ModelState以指示相关错误的调用。在全球范围内执行此操作并不是一个好方法,因为特定的SQL错误只能在调用时解释,而不是以通用方式处理。

0

我不记得NerdDinner的确切代码,尽管我已经看过它。然而,在我的应用程序,我通常做在数据库中RAISERROR(“某些错误”,16,1),并在我的控制器/模型中使用一个try/catch像这样:

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

然后我就可以呈现但我认为错误在我看来。

+2

一般而言,我会非常小心地将异常状态消息盲目地放入页面供最终用户查看,因为您可能会不经意地提供有关数据库形状的非常敏感的信息。 – 2009-05-19 15:28:53

0

你的假设是错误的。日期时间字段不用于数据库验证。

我不得不在NerdDinner/MVC课程中讨论的一件事是验证将发生在Dinner.cs的OnValidate()部分方法以及调用UpdateModel()的DinnersController.cs中。该调用将屏幕中的文本复制到模型中。例如,如果它试图将文本复制到浮点数,或者解析和无效日期,它将更新ModelState并引发错误。正常的验证不会运行。