ASP.NET MVC DataAnnotation - преобразовать в нижний регистр - PullRequest
1 голос
/ 10 июля 2011

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

Во-первых, я начал с того, что регулярное выражение для полей ввода принимает только нижний регистр. Похоже, самая умная вещь, чтобы сделать. Но это ужасно. Проще говоря, даже если я вставлю текст You must use only lowercase letters, люди его не читают, расстраиваются, а потом просто не удосуживаются зарегистрироваться.

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

Однако сейчас мне приходится делать это в нескольких местах. И это становится неприятным. Мне было интересно, есть ли способ сделать DataAnnotation для моей ViewModel, например ..

class LoginViewModel {
   [ConvertLowercase]
   public string Email { get; set; }

   /// ... other view model properties
}

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

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

Ответы [ 2 ]

3 голосов
/ 11 июля 2011

здесь есть один вариант: (создание свойства только для чтения, которое должно быть передано на ваш контроллер / бизнес-уровень)

class LoginViewModel {

     public string Email { get; set; }

     public string LowerCaseEmail  
     {                                    //This is a read only property.
          get { 
                return Eamil.ToLower();
              }
     }

     /// ... other view model properties
  }
3 голосов
/ 10 июля 2011

IMHO DataAnnotations не может и не должна изменять данные. Такая логика должна идти либо в пользовательском связывателе модели, либо в фильтре действий. Или, возможно, даже лучше, в хранилище данных перед сохранением данных в хранилище данных.

Кроме того, вы не всегда должны иметь все в нужном случае, это может стать проблемой, если вместо того, чтобы пытаться использовать перегрузки строки Compare, функцию Equals (или функции Linq), которые принимают StringComparison или StringComparer и укажите OrdinalIgnoreCase.

...