加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何在视图模型中执行列表? dataannotations

发布时间:2020-12-15 04:29:44 所属栏目:百科 来源:网络整理
导读:我使用的是asp.net mvc 3,数据注释和自动映射. 我想在我的视图模型中的属性上的所有注释,一旦属性通过验证,我使用自动映射器将其映射回我的域对象. 我有一个视图模型,具有我想要的集合的属性,因为我想从它们生成一个表.稍后我也想使用它们作为一个表单来添加
我使用的是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将模型替换为相应的视图模型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读