2011-04-14 92 views
1

I'm今天開始...... 但有一些問題,下拉模式I'm與AutoMapper工作...AutoMapper問題下拉

我有什麼至今:

用戶模型

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 - 我回國內容(),因爲所有支持AJAX的使用HTML 5 pushState的等等等等
2 - 在我的更新(POST一個)方法中,我的模型 ret Autommapper所有的角色= null

爲什麼我的Automapper返回的角色爲null?
這是與AutoMapper一起使用的正確方法嗎?任何提示?

感謝

+1

首先,您通常在application_start期間執行一次「CreateMap」。其次,什麼是「用戶系統」?你沒有提供這個佈局。另外,在設置Automapper(用你的「CreateMap」調用)之後,總是執行一個「AssertConfigurationIsValid」來確保你不會丟失任何映射。 – PatrickSteele 2011-04-15 14:23:33

+0

感謝您的幫助...這是一個錯誤... UserSystem = User ...我現在的問題是隻有Automapper返回的角色... – Paul 2011-04-15 17:46:50

回答

3

地圖失敗,因爲你試圖給一個角色直接映射到角色的集合。並將角色集合回單個角色。由於它們是不同的類型,因此無法直接映射這些映射。

如果您想將角色映射到列表,那麼您可以使用自定義值解析器。

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; 
    } 
}