2013-04-11 6 views
0

Работы в MVC3, C#Расширение класса с частичным классом

Я задаюсь вопрос о «иерархии» образцовая, класс таблицы БД и частичном классе.

В дб у меня есть таблица учетная_запись_пользователя структурирована:

UserAccount: UserId, ПгвЬЫате, LastName, логин, пароль, адрес электронной почты

В моем проекте у меня есть модель под названием UserModel. Я использую его, чтобы украсить свойства данными. она устанавливается как тип метаданных для класса UserAccount, например, так:

[MetadataType(typeof(UserModel))] 
public partial class useraccount 
{ 
} 

public class UserModel 
{ 
    public int UserId { get; set; } 

    [Display(Name="First Name")] 
    [StringLength(20)] 
    [Required] 
    public string FirstName { get; set; } 

    [Display(Name = "Last Name")] 
    [StringLength(30)] 
    [Required] 
    public string LastName { get; set; } 

    [Display(Name = "Email Address")] 
    [StringLength(20)] 
    [Required] 
    public string email { get; set; } 

    [Remote("IsUserNameAvailable", "Validation")] 
    [Display(Name = "Choose a Login Name")] 
    [StringLength(40)] 
    [Required] 
    public string login { get; set; } 

    [Display(Name = "Choose a Password")] 
    [StringLength(64)] 
    [Required] 
    public string password { get; set; } 

    [Display(Name = "Enter Password Again")] 
    [StringLength(64)] 
    [Required] 
    public string confirmPassword { get; set; } 

} 

Уведомление в таблице базы данных есть столбец «Пароль», но нет «confirmPassword», однако в UserModel, нет.

Мое мышление - это класс UserAccount, использующий класс UserModel для метаданных, теперь должен содержать определение для «confirmPassword».

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

@model OurAgreements.Models.UserModel 

проблема возникает в контроллере, когда я пытаюсь сохранить. Этот код:

public ActionResult Register(UserModel model) 
    { 
     var repo = new Repository(); 

     if (ModelState.IsValid) 
     { 
      using (var db = new ouragreementEntities()) 
      { 
       db.useraccount.Add(model); 
       db.SaveChanges(); 
      } 

      return View(); 
     } 

дает ошибку, не может преобразовать UserModel в useraccount. Я могу понять это, я пытаюсь помещать данные в таблицу, которая не соответствует всем столбцам.

Итак, я понял, я хотел бы изменить модель на целях:

@model OurAgreements.Models.useraccount 

, потому что в моем мышлении, класс учетная_запись_пользователя не должен использовать UserModel, но делать это дает ошибку «учетная_запись_пользователь не имеет определение для 'confirmPassword'

Так что я немного застрял. Я знаю, что могу вернуться к использованию UserModel в качестве модели, а затем в контроллере я могу создать новый экземпляр useraccount и заполнить его данными из модели, а затем сохранить экземпляр в базу данных.

Так что, наверное, мой вопрос, почему пользовательский учет не содержит определения для подтверждения пароля?

ответ

0

Вы были на правильном пути раньше, создав View Model, которая содержит ваши DataAnnotations и дополнительные свойства, которых нет в вашей базе данных. Этот ViewModel и связанные с ним DataAnnotations помогают вам выполнять логику проверки бизнеса, а также позволяют сопоставлять одну или несколько табличных данных для одного класса для вашего представления.

Итак, что касается вашего общего вопроса, почему в базе данных нет пароля подтверждения? Почему это должно быть? Наличие двух копий одних и тех же данных в базе данных не имеет смысла в области хранения данных.

Подтверждающий пароль - это проверка бизнес-логики/пользователя, чтобы гарантировать, что они не «просунут пальцем» пароль и заблокируют себя из своей учетной записи. Как только вы подтвердите, что введенный им пароль является тем, который они намеревались (пароль == confirmPassword), вы вводите пароль и помещаете его в базу данных.

1

Прежде всего. Измените название своих классов. Используйте UserAccountMetadata/UserAccount. Это значительно облегчает чтение и понимание.

Также используйте атрибут compare в поле подтверждения пароля, чтобы вы могли быть уверены, что они совпадают. Атрибут datatype должен присутствовать в обоих полях пароля.

[DataType(DataType.Password)] 
[Display(Name = "Confirm Password")] 
[Compare("Password", ErrorMessage = "Password and confirm password must be same!")] 
public string confirmPassword { get; set; } 

Модель, используемая вами для просмотра, должна быть UserAccount.

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