Как получить проверку базы данных среди моих нарушений правил в ASP.NET MVC?

В примере с NerdDinner написан набор бизнес-правил для проверки данных в модели. Такие вещи, как пустые строки проверяются, и, вызывая modelObject.GetRuleViolations(), вы можете получить их все. Но есть еще один уровень проверки - база данных. Например, поле datetime оставлено для проверки в базе данных, которая принимает только строку, которая может быть преобразована в объект DateTime.

Проблема, которую я вижу, состоит в том, что modelObject.GetRuleViolations() никогда не возвращает нарушение для datetime. Таким образом, даже если сохранение записи корректно запрещено, и отображается форма с указанием ошибки и выделением поля datetime, конкретного сообщения об ошибке нет. Есть ли способ получить ошибки проверки базы данных среди ошибок проверки бизнес-правил?

3 ответа

Решение

Вам нужно перехватить исключения, создаваемые вашим уровнем доступа к данным, и преобразовать их в вызовы, которые обновляют ModelState, чтобы указывать на ошибки, о которых идет речь. На самом деле не существует хорошего способа сделать это на глобальном уровне, поскольку конкретные ошибки SQL можно будет интерпретировать только во время их вызова, а не обрабатывать универсальным образом.

Я не помню точный код от NerdDinner, хотя я посмотрел на него. Однако в моих приложениях я обычно делаю raiserror("Некоторая ошибка",16,1) в базе данных и использую try/catch в моем контроллере / модели следующим образом:

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

Затем я могу отобразить ошибку в моем представлении, как я хочу.

Ваше предположение неверно. Поле datetime не оставлено для проверки в базе данных.

В уроках NerdDinner/MVC мне пришлось столкнуться с тем, что проверка будет происходить как в частичном методе Dinner.cs OnValidate(), так и в DinnersController.cs при вызове UpdateModel(). Этот вызов копирует текст с экрана в модель. Если, например, он попытается скопировать текст в число с плавающей точкой или проанализировать и указать недопустимую дату, он обновит ModelState и выдаст ошибку. Обычная проверка не будет запущена.

Другие вопросы по тегам