0

我有一个列出所有用户的索引页面。这在用户控制器中有以下内容 -

 public ViewResult Index()
        {
            return View(userRepository.AllIncluding(user => user.Roles));
        }

然后视图从

@model IEnumerable<TRS.Models.User>

然后使用

 @foreach (var item in Model) {

循环遍历我模型中的所有用户。

我现在需要将我的模型更改为包含 User 模型和扩展 UserDetails 模型的 ViewModel。

我已更改我的索引视图以使用视图模型 -

@model IEnumerable<TRS.ViewModels.RegisterViewModel>

但我不知道我应该如何在我的控制器中填充 ViewModel -

public ViewResult Index()
        {

            var viewModel = new RegisterViewModel
            {
                UserName = "???"
                FirstName = "???"
                LastName = "???"
            };

            return View(viewModel);
        }

我假设我需要创建视图模型的一个实例,然后将其传递给视图。但我不明白如何获取每个单独项目的数据。我显然需要在这里获取所有用户的所有数据,然后在我看来遍历它们。任何想法我应该在上面的控制器中做什么?应该用什么代替“???” 这样会用所有数据填充 viewModel 吗?或者这是错误的方法?

谢谢

编辑 - 添加模型 -

public class User
    {
        [Key]
        public string UserName { get; set; }

        public virtual ICollection<Role> Roles { get; set; }
        public virtual UserDetails UserDetails { get; set; }
}


 public class UserDetails
    {

        [Key]
        public string UserName { get; set; }
        public string Firstname { get; set; }
        public string Lastname { get; set; }

        [Required]
        public virtual User User { get; set; }
}

编辑 - 从视图 -

<td>
                @foreach (Role role in item.Roles){
                @role.RoleName <br />
    }</td> 
4

4 回答 4

1
public ActionResult Index()
{
    var usersVm = userRepository
        .AllIncluding(user => user.Roles)
        .Select(user => new RegisterViewModel
        {
            UserName = user.UserName
            FirstName = user.UserDetails.FirstName
            LastName = user.UserDetails.LastName
        });
    return View(usersVm);
}
于 2012-10-10T09:21:07.713 回答
0

从您的问题中不清楚 UserDetails 是什么样的。

您不应在视图中使用 IEnumerable<RegisterViewModel>。RegisterViewModel 应该是您在视图中需要的所有内容的容器:

    public ViewResult Index()
    {
        var usersDetails = GetUserDetails(userRepository.AllIncluding(user => user.Roles));

        var viewModel = new RegisterViewModel
        {
            UserDetails = usersDetails.ToList(),
            SomeMoreDataRequiredByTheView= "1"
        };

        return View(viewModel);
    }

   //you can use automapper to do this dirty job.
   private IEnumerable<UserDetails> GetUserDetails(IEnumerable<User> users)
   {
       foreach(var user in users)
       {
           yield return new UserDetails()
           {
               FullName = user.FirstName + " " + user.LastName,
               // Other stuff you want

           };
       }
   }
于 2012-10-10T09:24:44.203 回答
0

你的视图模型

    Public Class RegisterViewModel
   {
      Public IEnumerable<TRS.Models.User> AllUsers {get;set;}
      Public IEnumerable<TRS.Models.UserDetails> UserDetails {get;set;}
   } 

然后在你的控制器中

public ViewResult Index()
{

    var viewModel = new RegisterViewModel
    {
        AllUsers = userRepository.AllIncluding(user => user.Roles).ToList()
    };

    var DetailList = new list<TRS.Models.UserDetails>();
    foreach(var user in viewModel.AllUsers)
    {
        DetailList.add(new userDetails
       {
          name = user.Name,
          age = user.age, 
          ....
       }
    }

    viewModel.UserDetails = DetailList;

    return View(viewModel);
}
于 2012-10-10T09:25:12.997 回答
0

Automapper就是为此而创建的。我强烈推荐它。

阅读 wiki 的入门部分。

配置完成后,您的控制器代码将如下所示:

List<RegisterViewModel> registrants = 
                  Mapper.Map<List<User>, List<RegisterViewModel>>(users);

尽管您可能想要考虑一个包含注册人列表的视图模型,但这取决于您。

于 2012-10-10T09:20:08.383 回答