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

cho*_*bo2 10 c# asp.net-mvc viewmodel asp.net-mvc-3

我使用的是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;}
}
Run Code Online (Sandbox Code Playgroud)

我想使用这些属性来生成我的表并用于表单.

我唯一能想到的就是这样做

   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>();
       }
   }
Run Code Online (Sandbox Code Playgroud)

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

这样我就可以使用我的域模型来生成表,并使用AddUserViewModel来添加用户.

看起来有点多余,所以我不确定是否有更好的方法.

编辑

我有类似的东西

 var viewModel = new UserViewModel();
 List<Users> users=  UserService.GetAllUsers();
 viewModel = Mapper.Map<Users, UserViewModel>(users);
 return View("Index", viewModel);
Run Code Online (Sandbox Code Playgroud)

我也试过了

var viewModel = new UserViewModel();
 List<Users> users=  UserService.GetAllUsers();
 viewModel.AddUserViewModel = Mapper.Map<Users, AddUserViewModel>(users);
 return View("Index", viewModel);
Run Code Online (Sandbox Code Playgroud)

编辑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.
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 16

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

现在你的控制器动作可能如下所示:

public ActionResult Foo()
{
    SomeModel model = _repository.GetModel();
    SomeViewModel viewModel = Mapper.Map<SomeModel, SomeViewModel>(model);
    return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在视图中使用此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);
}
Run Code Online (Sandbox Code Playgroud)

我还在示例项目中使用了AutoMap属性,可以简化您的代码:

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

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