微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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将模型替换为相应的视图模型.

原文地址:https://www.jb51.cc/csharp/91376.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐