2

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

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

4

3 回答 3

2

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

于 2009-05-19T07:06:00.697 回答
0

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

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

然后,我可以根据需要在我的视图中呈现错误。

于 2009-05-19T07:07:39.727 回答
0

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

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

于 2009-10-23T16:32:23.093 回答