如果遇到需要返回一个集合对象,其中该集合中的属性又是一个集合。第一种:可在考虑用外键关联,比如在控制器中可以采用预先加载的方式加载关联的数据,比如 RoleManager.Roles.Include<x =>r.Users>.ToList();

第二种 可以考虑使用视图模型ViewModel的方式。第二种方式的适用范围更加广泛,第一种方式使用较为简单,但使用的场合有限。

一、建立视图模型 ViewModel

public class IndexRoleViewModel
{
public string Id { get; set; }

[Required(AllowEmptyStrings = false)]
[Display(Name = "角色名称")]
public string Name { get; set; }

[Display(Name = "角色描述")]
[StringLength(50, ErrorMessage = "{0}不能超过50个字符")]
[DataType(DataType.MultilineText)]
public string Description { get; set; }

public List<ApplicationUser> ApplicationUsers { get; set; }   //属性为一个集合。就定义一个List泛型对象。

}

二、控制器:

public async Task<ActionResult> Index()   //这里采用了异步方法,要使用异步方法,必须引入/ System.Data.Entity命名空间。
{
var rolesList =new List<IndexRoleViewModel>();
foreach (var role in await RoleManager.Roles.ToListAsync())
{
var _IndexRoleViewModel = new IndexRoleViewModel()
{
Id = role.Id,
Name = role.Name,
Description = role.Description,
ApplicationUsers =new List<ApplicationUser>() //特别注意,初始化一个空的List泛型集合。如果不初始化,将为触发一个引用为Null的异常。
};

foreach (var user in await UserManager.Users.ToListAsync()) //遍历用户
{
if (UserManager.IsInRole(user.Id,role.Name))  //如果用户拥有这个角色,就加入到viewModel 对象的List属性中。
{
_IndexRoleViewModel.ApplicationUsers.Add(user);
}
}

rolesList.Add(_IndexRoleViewModel);
}

return View(rolesList.ToList()); //异步方法在 System.Data.Entity命名空间下面。
}

三、视图:

@model IEnumerable<MajorConstruction.Areas.Admin.Models.IndexRoleViewModel>  //模型为IEnumerabel<ViewModel> 类型。

@{
ViewBag.Title = "角色列表";
}
<h2>@ViewBag.Title</h2>
<hr />
<p>
@Html.ActionLink("新建角色", "Create")
</p>
<table class="table table-striped table-hover">
<thead>
<tr>
<th>
@Html.DisplayName("角色名称")
</th>
<th>
@Html.DisplayNameFor(model => model.Description)
</th>
<th>@Html.DisplayName("拥有此角色的成员")</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Description)
</td>
<td>
<ol>  //使用有序列表在表格中来显示属性的多字段。
@foreach (var userForRole in item.ApplicationUsers)  
{
<li>@userForRole.UserName | @userForRole.RealName</li>
}
</ol>
</td>
<td>
@Html.ActionLink("编辑", "Edit", new { id = item.Id }) |
@Html.ActionLink("详细", "Details", new { id = item.Id }) |
@Html.ActionLink("删除", "Delete", new { id = item.Id })
</td>
</tr>
}
</tbody>
</table>

返回一个集合对象,同时这个集合的对象的属性又是一个集合对象的处理方法(ViewModel)的更多相关文章

  1. 使用jQuery匹配文档中所有的li元素,返回一个jQuery对象,然后通过数组下标的方式读取jQuery集合中第1个DOM元素,此时返回的是DOM对象,然后调用DOM属性innerHTML,读取该元素 包含的文本信息

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用

    opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用

  3. 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。

    谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数. Google2009华南地 ...

  4. parents([expr]) 取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素)。可以通过一个可选的表达式进行筛选。

    parents([expr]) 概述 取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素).可以通过一个可选的表达式进行筛选.大理石平台检定规程   参数 exprStringV1.0 用于 ...

  5. parent([expr]) 取得一个包含着所有匹配元素的唯一父元素的元素集合。

    parent([expr]) 概述 取得一个包含着所有匹配元素的唯一父元素的元素集合.大理石构件 你可以使用可选的表达式来筛选. 参数 exprStringV1.0 用来筛选的表达式 示例 描述: 查 ...

  6. 封装一个 员工类 使用preparedStatement 查询数据 (2) 使用 arrayList 集合

    创建 员工=类生成 有参构造 get set 方法 toString 方法 package cn.hph; public class emp1 { //创建员工类的属性 private int id; ...

  7. JS对象随机数 random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数。 注意:返回一个大于或等于 0但小于1的符号为正的数值

    随机数 random() random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数. 语法: Math.random(); 注意:返回一个大于或等于 0 但小于 1 ...

  8. 集合-强大的集合工具类:java.util.Collections中未包含的集合工具

    任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.Guava沿着这些路线提供了更多的工具方法:适用于所有集合的静态方法.这是Guava最流行和成熟 ...

  9. [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具

    原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...

随机推荐

  1. 钓鱼(洛谷 P1717)

    题目描述 话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999决定请他吃一次“年年大丰收”,为了表示诚意,他还决定亲自去钓鱼,但是,因为还要准备2013NO ...

  2. linux 常见名词及命令(二)

    pwd 用于显示当前的工作目录. cd 用于切换工作路径 cd - 切换到上一次的目录 cd ~ 切换到家目录 cd ~username 切换到其他用户的家目录 cd .. 切换到上级目录 ls 用于 ...

  3. UVA 11827 Maximum GCD【GCD,stringstream】

    这题没什么好说的,但是输入较特别,为此还WA了一次... 题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge& ...

  4. File类的三种构造方法

    package cn.zmh.File; import java.io.File; /* * * File类的构造方法 三种重载形式 * * */ public class FileDemo1 { p ...

  5. asp.net core 集成JWT(一)

    [什么是JWT] JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT ...

  6. oracle统计信息

    手工刷ORACLE统计信息  select count(1) from LOG_TRX_DETAIL;  select * from user_tab_statistics where table_n ...

  7. MySQL多实例配置(一)

    MySQL数据库的集中化运维,能够通过在一台MySQL数据库服务器上,部署多个MySQL实例.该功能是通过mysqld_multi来实现.mysqld_multi用于管理多个mysqld的服务进程,这 ...

  8. js 计算两个日期之间 相差几年几月几日

    1.计算日期差 Mine.vue <!-- 我的 --> <template> <div> <!-- 标题栏 --> <x-header :lef ...

  9. robotframework接口自动化

    robot framework框架在测试接口上比soapUI好用的多,在此介绍下get方法的HTTP接口,其实这个接口也是把POST数据作为参数进行get请求,使用post 方法也是一样,一共6步就可 ...

  10. 【转】TestNG执行顺序控制

    1.class执行顺序控制---testng.xml之preserve-order preserve-order:用来控制<test>里面所有<classes>的执行顺序.&l ...