Передать пользователя в ViewModel

ОК, немного застрял здесь.

ViewModel

public class UserProfileEdit
{
    public virtual ApplicationUser ApplicationUser { get; set; }

    [Required]            
    public string FirstName { get; set; }

    public string TwitterHandle{ get; set; }

    [Required]
    [Display(Name = "Email")]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    // etc etc
}

КОНТРОЛЛЕР

public ActionResult YourProfile()
{
    string username = User.Identity.Name;           

    ApplicationUser user = db.Users.FirstOrDefault(u => u.UserName.Equals(username));

    // Construct the viewmodel
    UserProfileEdit model = new UserProfileEdit();            
   model.ApplicationUser = user;

     return View(model); 
}

И на View у меня есть @model MySite.Models.UserProfileEdit на вершине.

Как я могу передать пользователя ViewModel? Я знаю, что могу сделать это построчно

model.Email = user.Email;

например, а должно быть проще?

2 ответа

Решение

У вас есть несколько вариантов сделать то, что вы хотите сделать.

Вы можете использовать такой инструмент, как AutoMapper.

Или вы можете передать данные конструктором:

public class UserProfileEdit
    {
        public virtual ApplicationUser ApplicationUser { get; set; }

        [Required]            
        public string FirstName { get; set; }

        public string TwitterHandle{ get; set; }

        [Required]
        [Display(Name = "Email")]
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }

        // etc etc

        public UserProfileEdit() {}

        public UserProfileEdit(ApplicationUser user) {
              this.ApplicationUser = user;
              this.Email = user.Email;
              // ...
        }

}

 public ActionResult YourProfile()
        {
            string username = User.Identity.Name;           

            ApplicationUser user = db.Users.FirstOrDefault(u => u.UserName.Equals(username));

             return View(new UserProfileEdit(user)); 
        }

Или используя метод для инициализации данных модели представления:

public class UserProfileEdit
    {
        public virtual ApplicationUser ApplicationUser { get; set; }

        [Required]            
        public string FirstName { get; set; }

        public string TwitterHandle{ get; set; }

        [Required]
        [Display(Name = "Email")]
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }

        // etc etc

        public void Init(ApplicationUser user) {
              this.ApplicationUser = user;
              this.Email = user.Email;
              // do what you want to do
        }

}

 public ActionResult YourProfile()
        {
            string username = User.Identity.Name;           

            ApplicationUser user = db.Users.FirstOrDefault(u => u.UserName.Equals(username));
            UserProfileEdit vm = new UserProfileEdit();
            vm.Init(user);

             return View(vm); 
        }

Вы можете сделать это построчно, или вы можете использовать AutoMapper. Попробуйте http://automapper.org/

Это особенно полезно, когда в вашем коде повторяются сопоставления объектов одного типа.

Другие вопросы по тегам