如何在视图模型中列出? + dataannotations

时间:2011-01-30 19:13:34

标签: c# asp.net-mvc asp.net-mvc-3 viewmodel

我正在使用asp.net mvc 3,数据注释和自动映射器。

一旦属性通过验证,我想在视图模型中对属性进行所有注释我使用自动映射器将其映射回我的域对象。

我有一个viewmodel,它具有我想拥有的集合属性,因为我想从它们生成一个表。我还想稍后使用它们作为表单来向这个表添加行。

那我该怎么办?如何获取这些属性并收集它们?

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

所以基本上我将它作为一个单独的视图模型包含在另一个包含用户列表(我的域模型)的视图模型中

这样我就可以使用我的域模型为我添加用户生成表格和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.

1 个答案:

答案 0 :(得分:15)

为什么要在视图模型中返回域对象列表?这不是视图模型应该是什么。视图模型应仅引用其他视图模型。所以你有一个代表用户的好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);
}

我还在AutoMap中使用了sample project属性,这可以简化您的代码:

[AutoMap(typeof(IEnumerable<Users>), typeof(IEnumerable<UserViewModel>))]
public ActionResult Foo()
{
    IEnumerable<Users> users = _repository.GetUsers();
    return View(users);
}

此属性将在控制器操作之后和渲染视图之前自动运行,并使用AutoMapper将模型替换为相应的视图模型。