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

前端之家收集整理的这篇文章主要介绍了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将模型替换为相应的视图模型.

猜你在找的C#相关文章