2012-06-01 3 views
4

Я разрабатываю новый сайт с ASP.NET MVC 4 (Beta), VS 11 (бета), EF 5 (бета), но этот вопрос подходит для выпущенных версий ASP .NET MVC 3, VS 2010, EF 4 тоже.DataValidation Model/ViewModel/Entity Framework Code First

Первый шаг: Я использую Entity Framework Code First подход, к примеру, у меня есть следующая модель пользователя:

public class User 
{ 
    [Key] 
    public int UserId {get;set;} 

    public String LoginName { get; set; } 

    public String Password { get; set; } 
} 

Теперь для регистрации мне нужна другая модель, модель регистрации:

public class Registration 
{ 
    public String LoginName { get; set; } 

    public String Password { get; set; } 

    public String PasswordConfirm { get; set; } 
} 

Здесь возникают проблемы: где я должен помещать свои аннотации DataValidation? Например, пароль должен составлять не менее 10 символов, а PasswordConfirmed должен соответствовать паролю и т. Д. Должен ли я писать это на каждой модели, которая могла бы что-то сделать с паролем (я тоже думаю, что имею модель ChangePassword)

Другое дело в том, как иметь дело с контроллером. Когда я показываю свою регистрационную ViewModel, и все в порядке, я создаю модель пользователя и назначаю переменные из Registration ViewModel?

Иногда у меня много свойств, которые поступают в базу данных, но не отображаются пользователю (внешние ключи, вычисленные значения и т. Д.).

Как подумать о СУШЕ, я не хочу повторять себя.

Какова наилучшая практика для этого?

Должно быть ясным: аннотации не нужны. Если есть более эффективные способы проверки, я буду рад, если вы их покажете.

ответ

2

Я не могу сказать объективно, что это «лучшая практика», но вот как я это вижу. Если вы связываете к модели представления, проверить модель представления, так:

public class Registration 
{ 

    public String LoginName { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength=10)] 
    public String Password { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength=10)] 
    public String PasswordConfirm { get; set; } 
} 

Вы можете сделать проверку «вручную» в контроллере, проверьте на POST, если пароль и подтверждение совпадения, если не добавить запись в ModelState (но это может привести к повторению кода и немного громоздкий) ИЛИ использовать хороший IValidatableObject интерфейс на модели:

public class Registration : IValidatableObject 
{ 

    public String LoginName { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength=10)] 
    public String Password { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength=10)] 
    public String PasswordConfirm { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext context) 
    { 
     if(Password != PasswordConfirm) 
      yield return new ValidationResult("Confirmation doesn't match", new[] {"PasswordConfirm"}) 
     //etc. 
    } 
} 

Теперь с этим, когда вы ваша модель связаны после POST, валидация выполняется путем простого вызова ModelState.IsValid и если он недействителен, он возвращает список ошибок, включая ваши пользовательские ошибки.

Теперь, конечно, вы можете поместить DataAnnotations на DB-модель в качестве дополнительной меры, просто «в случае», чтобы избежать исключений усечения строк и т. Д.если вы как-то забыли и попытались вставить длинную строку в базу данных в любом случае

Что касается сопоставления, да, после того, как вы подтвердили свою модель, в конце действия POST вы обычно сопоставляете свойства модели с либо новый экземпляр User (при добавлении в БД), либо в существующий для обновления. Вы можете использовать AutoMapper или написать наивный картограф самостоятельно, используя отражение - это относительно простая задача, но лучше оставить это как самостоятельное упражнение, нет смысла изобретать колесо.

1

Вы должны создавать свои объекты только на уровне домена. Но когда вам нужны некоторые аннотации DataValidation для вашей сущности, вы можете использовать для этого MvcExtensions. И если у вас есть составные или вложенные объекты, и вы хотите получить их как сглаженные объекты, вы должны использовать automapper. Это будет для вас наилучшей практикой!

+0

Ну, мне не нужны аннотации. Я также могу использовать другие методы –

Смежные вопросы