gpt4 book ai didi

c# - 如何在 View 模型中执行列表? + 数据注释

转载 作者:可可西里 更新时间:2023-11-01 09:02:26 25 4
gpt4 key购买 nike

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

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

我有一个 View 模型,它具有我想要收集的属性,因为我想从它们生成一个表。我还想稍后使用它们作为向该表添加行的表单。

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

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

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

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

最佳答案

为什么要在 View 模型中返回域对象列表?这不是 View 模型应该是的。 View 模型应该只引用其他 View 模型。所以你有一个很好的UserViewModel代表一个用户。现在您需要在您的 View 中与多个用户一起工作,因此您要么传递 IEnumerable<UserViewModel>或者如果您需要一些其他属性,您可以为此设计一个 View 模型:

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

现在您的 Controller 操作可能如下所示:

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

现在在您的 View 中,您可以简单地为这个 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);
}

此属性将在 Controller 操作之后和 View 呈现之前自动运行,并将使用 AutoMapper 将模型替换为相应的 View 模型。

关于c# - 如何在 View 模型中执行列表? + 数据注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4844887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com