Как получить проверку базы данных среди моих нарушений правил в 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 и выдаст ошибку. Обычная проверка не будет запущена.