c# – 如何在视图模型中执行列表? dataannotations
我使用的是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); } 该属性将在控制器操作之后并且在呈现视图之前自动运行,并且将使用AutoMapper将模型替换为相应的视图模型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |