如何在ASP.NET MVC中违反规则进行数据库验证?

时间:2009-05-19 06:51:56

标签: asp.net-mvc database validation nerddinner

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

然后我可以在我的视图中渲染错误,但是我想要。

答案 2 :(得分:0)

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

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