Частичная проверка ASP.NET MVC - PullRequest
2 голосов
/ 12 июня 2009

Я прочитал несколько статей о валидации и asp.net mvc, и большинство из них указывают на валидацию в модели. Проблема, которую я вижу со всеми из них, заключается в том, что они не обрабатывают разные сценарии или, по крайней мере, они не показывают, как они будут достигнуты, например,

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

Кто-нибудь может указать мне на какие-нибудь статьи о проверке mvc, которые решают вышеуказанные проблемы? Или у кого-нибудь есть какие-либо советы по передовым методам обработки таких проверок?

Я думал о введении «действия проверки», такого как создание, чтение, обновление, удаление, и затем я мог проверять один и тот же бит данных в зависимости от контекста, в котором они используются. У кого-нибудь есть мысли о том, чтобы что-то делать таким образом?

Заранее спасибо за любую помощь

Ответы [ 2 ]

2 голосов
/ 12 июня 2009

Вот почему я использую валидаторы отдельно от моделей. Итак, у меня есть IValidator и разные валидаторы. Для создания экземпляра валидатора я использую DI Container (например, StructureMap).

Это было описано (не мной) здесь: Проблемы с моим шаблоном хранилища MVC и StructureMap

1 голос
/ 22 июля 2009

По моему опыту

1. Validator должен быть отделен от контроллера на отдельный уровень Service, как, например, показано в этом руководстве: http://www.asp.net/learn/mvc/tutorial-38-cs.aspx

2. Сервисные методы могут инкапсулировать все виды проверки. Например:

    public bool PlaceBooking(Booking booking)
    {
      //Model validation
      IEnumerable<ErrorInfo> errors = DataAnnotationsValidationRunner.GetErrors(booking);
      if (errors.Any())
          _validationDictionary.AddErrors("error", errors);

      // Business rule: Can't place bookings on Sundays
      if(booking.ArrivalDate.DayOfWeek == DayOfWeek.Sunday)
         _validationDictionary.AddError("ArrivalDate", "Bookings are not permitted on Sundays");

      if (!_validationDictionary.IsValid) return false;

      //Errors comming from Data Access Layer
      try
      {
         return _dao.Save(booking);
      }
      catch (DBExecutionException ex)
      {
         if (ex.ResultCode == ResultCodes.RES_UNIQUEINDEX)
          _validationDictionary.AddError("error", "Booking already exists.");
         else
          _validationDictionary.AddError("error", "Some other DB issue happens.");
       }
      return false;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...