2009-06-11 4 views
2

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

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

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

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

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

ответ

2

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

Он был описан (не мной) здесь: Issues with my MVC repository pattern and StructureMap

1

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

1. Оценщик должен быть отделен от контроллера в отдельный слой обслуживания, как, например, показано в этом учебнике: 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; 
    } 
Смежные вопросы