Вопрос правил проверки ужина с ботаником - PullRequest
0 голосов
/ 15 мая 2009

В руководстве NerdDinner, шаг 5 , посередине под Завершить редактирование реализаций метода действия есть абзац:

Приятной особенностью нашей реализации Edit является то, что ни наш класс Controller, ни наш шаблон View не должны ничего знать о конкретной проверке или бизнес-правилах, применяемых нашей моделью Dinner. Мы можем добавить дополнительные правила к нашей модели в будущем и не должны вносить какие-либо изменения в код нашего контроллера или представления для их поддержки. Это дает нам гибкость, позволяющую легко изменять требования наших приложений в будущем с минимальными изменениями кода.

Мой вопрос: какое правило можно добавить и таким образом, чтобы я не потерял свое чистое разделение. Я вижу этот код:

 public static class ControllerHelpers {

   public static void AddRuleViolations(this ModelStateDictionary modelState, IEnumerable<RuleViolation> errors) {

       foreach (RuleViolation issue in errors) {
           modelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
       }
   }
}

лучше, чем этот код:

catch {
    foreach (var issue in dinner.GetRuleViolations()) {
        ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
    }

    return View(dinner);
}

потому что у меня нет конкретной информации о классе / модели, и я могу использовать ее в приложении. И я вижу, как это хорошо, если моя обработка ошибок проста, как описано выше, но я не понимаю, как бы я добавил что-то более сложное для новых бизнес-правил и надеялся на пример.

1 Ответ

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

Сначала поймите, что код, который вы разместили, на самом деле просто «извлекает» ошибки из Model и помещает их в представление (через ModelState). Гибкость заключается в том, что любые новые правила / изменения должны будут касаться только модели. т.е. вам нужно только нажать на код Dinner.cs.

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

...