Проблема AutoMapper с Dropdown - PullRequest
       4

Проблема AutoMapper с Dropdown

1 голос
/ 14 апреля 2011

Я начал работать с AutoMapper сегодня ... Но у меня возникли некоторые проблемы с моделью Dropdown ...

Что у меня есть:

Модель пользователя

public class User : Entity
{          
    public virtual string Name { get; set; }   
    public virtual string Email { get; set; }
    public virtual string Password { get; set; } 
    public virtual Role Role { get; set; }      
}

Ролевая модель

public class Role : Entity
{          
    public virtual string Name { get; set; }   
}

UserUpdateViewModel

public class UserUpdateViewModel
{
    public int Id{get;set;}

    [Required(ErrorMessage = "Required.")]
    public virtual string Name { get; set; }

    [Required(ErrorMessage = "Required."), Email(ErrorMessage = "Email Invalid."), Remote("EmailExists", "User", ErrorMessage = "Email already in use.")]
    public virtual string Email { get; set; }

    [Required(ErrorMessage = "Required.")]
    public virtual string Password { get; set; }

    [Required(ErrorMessage = "Required")]
    public virtual string ConfirmPassword { get; set; }

    [Required(ErrorMessage = "Required.")]
    public int RoleId { get; set; }

    public IList<Role> Roles { get; set; }
}

UserController

public ActionResult Update(int id=-1)
{
      var _user = (_userRepository.Get(id));
      if (_user == null)
          return RedirectToAction("Index");

       Mapper.CreateMap<User, UserUpdateViewModel>();
       var viewModel = Mapper.Map<User, UserUpdateViewModel>(_user);

       viewModel.Roles = _roleRepository.GetAll();

       return View(viewModel);
}

[HttpPost, Transaction]
public ActionResult Update(UserViewModel user)
{
     if (ModelState.IsValid)
     {
         user.Password = _userService.GetPasswordHash(user.Password);

         Mapper.CreateMap<UserViewModel, User>();
         var model = Mapper.Map<UserViewModel, User>(user);  //model.Role = null

         _userRepository.SaveOrUpdate(model); //ERROR, because model.Role = null
         return Content("Ok");
     }
     return Content("Erro").         
}

Просмотреть обновление

...
@Html.DropDownListFor(model => model.RoleId, new SelectList(Model.Roles, "Id", "Name"), "-- Select--", new { @class = "form radius" })   
...

Некоторыесоображения:
1 - я возвращаю Content (), потому что все Ajax включены с использованием HTML 5 PushState и т. д. и т. д.
2 - В моем методе обновления (POST one) моя модель возвращается Autommapperимеет Role = null

Почему моя роль, возвращенная Automapper, имеет значение null?
Это правильный способ работы с AutoMapper?Любой совет?

Спасибо

1 Ответ

3 голосов
/ 21 апреля 2011

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

Если вы хотите отобразить роль в список, вы можете использовать собственный преобразователь значений.

    Mapper.CreateMap<User , UserUpdateViewModel>()
    .ForMember(dest => dest.Roles, opt => opt.ResolveUsing<RoleToCollectionResolver>())


    Public class RoleToCollectionResolver: ValueResolver<User,IList<Role>>{ 
        Protected override IList<Role> ResolveCore(User source){
            var roleList = new List<Role>();
            roleList.Add(source.Role);
            Return roleList;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...