如何解决下拉菜单中的AutoMapper问题
| 我今天开始与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(),因为使用HTML 5 PushState等启用了所有Ajax
2-在我的Update(POST one)方法中,由Autommapper返回的模型的Role = null
为什么Automapper返回的我的角色为null?
这是使用AutoMapper的正确方法吗?有小费吗?
谢谢
解决方法
映射失败,因为您试图将单个角色直接映射到一组角色。并将角色集合返回到单个角色。您不能直接在它们之间进行映射,因为它们是不同的类型。
如果要将角色映射到列表,则可以使用自定义值解析器。
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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。