我使用的是asp.net mvc 3,数据注释和自动映射.
我想在我的视图模型中的属性上的所有注释,一旦属性通过验证,我使用自动映射器将其映射回我的域对象.
我有一个视图模型,具有我想要的集合的属性,因为我想从它们生成一个表.稍后我也想使用它们作为一个表单来添加行到这个表.
那我该怎么办?如何使用这些属性并收集它们?
public class Userviewmodel() { [required()] public string UserName = {get; set;} [required()] public string FirstName = {get; set;} [required()] public string LastName = {get; set;} }
我唯一可以想到的是这样做
public class AddUserviewmodel() { [required()] public string UserName = {get; set;} [required()] public string FirstName = {get; set;} [required()] public string LastName = {get; set;} } public class Userviewmodel() { public List<User> Users {get; set;} public AddUserviewmodel {get; set;} public Userviewmodel() { Users = new List<Users>(); } }
所以基本上我把它作为一个单独的视图模型,被包含在另一个viewmodel中,其中包含一个用户列表(我的域模型)
这样我就可以使用我的域模型来生成表和AddUserviewmodel来添加用户.
似乎有点多余,所以我不知道是否有更好的方法.
编辑
我有这样的东西
var viewmodel = new Userviewmodel(); List<Users> users= UserService.GetAllUsers(); viewmodel = Mapper.Map<Users,Userviewmodel>(users); return View("Index",viewmodel);
我也试过
var viewmodel = new Userviewmodel(); List<Users> users= UserService.GetAllUsers(); viewmodel.AddUserviewmodel = Mapper.Map<Users,AddUserviewmodel>(users); return View("Index",viewmodel);
编辑2
我有这个,它编译,但我得到这个错误
Someviewmodel viewmodel = new Someviewmodel (); List<User> users= userService.GetAllUsers(); viewmodel.Userviewmodel = Mapper.Map<List<User>,List<Userviewmodel>>(users); return View("Index",viewmodel); Trying to map Domain.User to viewmodels.Userviewmodel. Missing type map configuration or unsupported mapping. Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.
解决方法
为什么要在视图模型中返回域对象列表?这不是什么样的模型应该是.视图模型只能引用其他视图模型.所以你有一个很好的Userviewmodel代表一个用户.现在,您需要在视图中与多个用户合作,因此您可以传递一个IEnumerable< Userviewmodel>或者如果您需要某些其他属性,则为此设计视图模型:
public class Userviewmodel { [required] public string UserName = { get; set; } [required] public string FirstName = { get; set; } [required] public string LastName = { get; set; } } public class Someviewmodel { public List<Userviewmodel> Users { get; set; } public string SomeOtherProperty { get; set; } }
现在您的控制器操作可能如下所示:
public ActionResult Foo() { SomeModel model = _repository.GetModel(); Someviewmodel viewmodel = Mapper.Map<SomeModel,Someviewmodel>(model); return View(viewmodel); }
现在在您的视图中,您可以简单地为此Users属性(Html.DisplayFor(x => x.Users))使用显示模板来显示它们的列表.
更新:
在看到您的更新之后,如何继续遵循良好做法:
public ActionResult Foo() { IEnumerable<Users> users = _repository.GetUsers(); IEnumerable<Userviewmodel> usersviewmodel = Mapper .Map<IEnumerable<Users>,IEnumerable<Userviewmodel>>(users); return View(usersviewmodel); }
我还在sample project中使用了一个AutoMap属性,可以简化你的代码:
[AutoMap(typeof(IEnumerable<Users>),typeof(IEnumerable<Userviewmodel>))] public ActionResult Foo() { IEnumerable<Users> users = _repository.GetUsers(); return View(users); }