Как получить подтверждение базы данных среди моих нарушений правил в ASP.NET MVC? - PullRequest
2 голосов
/ 19 мая 2009

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

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

Ответы [ 3 ]

2 голосов
/ 19 мая 2009

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

0 голосов
/ 23 октября 2009

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

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

0 голосов
/ 19 мая 2009

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

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

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

...