返回一个集合对象,同时这个集合的对象的属性又是一个集合对象的处理方法(ViewModel)
如果遇到需要返回一个集合对象,其中该集合中的属性又是一个集合。第一种:可在考虑用外键关联,比如在控制器中可以采用预先加载的方式加载关联的数据,比如 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)的更多相关文章
- 使用jQuery匹配文档中所有的li元素,返回一个jQuery对象,然后通过数组下标的方式读取jQuery集合中第1个DOM元素,此时返回的是DOM对象,然后调用DOM属性innerHTML,读取该元素 包含的文本信息
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用
opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数. Google2009华南地 ...
- parents([expr]) 取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素)。可以通过一个可选的表达式进行筛选。
parents([expr]) 概述 取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素).可以通过一个可选的表达式进行筛选.大理石平台检定规程 参数 exprStringV1.0 用于 ...
- parent([expr]) 取得一个包含着所有匹配元素的唯一父元素的元素集合。
parent([expr]) 概述 取得一个包含着所有匹配元素的唯一父元素的元素集合.大理石构件 你可以使用可选的表达式来筛选. 参数 exprStringV1.0 用来筛选的表达式 示例 描述: 查 ...
- 封装一个 员工类 使用preparedStatement 查询数据 (2) 使用 arrayList 集合
创建 员工=类生成 有参构造 get set 方法 toString 方法 package cn.hph; public class emp1 { //创建员工类的属性 private int id; ...
- JS对象随机数 random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数。 注意:返回一个大于或等于 0但小于1的符号为正的数值
随机数 random() random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数. 语法: Math.random(); 注意:返回一个大于或等于 0 但小于 1 ...
- 集合-强大的集合工具类:java.util.Collections中未包含的集合工具
任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.Guava沿着这些路线提供了更多的工具方法:适用于所有集合的静态方法.这是Guava最流行和成熟 ...
- [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具
原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...
随机推荐
- Pollard rho模板
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #in ...
- 转 蓝桥杯 历届试题 波动数列 [ dp ]
传送门 历届试题 波动数列 时间限制:1.0s 内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个 ...
- msp430项目编程
msp430中项目---LED数码管显示 1.数码管介绍 2.代码(直接使用引脚驱动) 3.代码(使用译码器驱动) 4.项目总结 msp430项目编程 msp430入门学习
- Thinkphp 3.2使用Redis
(1)直接调用框架自带的Redis类: 路径:\ThinkPHP\Library\Think\Cache\Driver\Redis.class.php. public function test(){ ...
- wordpress优化:Gravatar头像被墙及解决方案
网站缓存现象: 打开网站是左下角出现0.gravatar.com.1.gravatar.com或2.gravatar.com字样,网站一直处于缓存状态,迟迟未能打开.很多人都会缺乏耐心地等待一个网页的 ...
- P1427 小鱼的数字游戏 洛谷
https://www.luogu.org/problem/show?pid=1427 题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个,数字 ...
- 【APUE】进程间通信之FIFO
FIFO也称为有名管道,它是一种文件类型,是半双工的.FIFO简单理解,就是它能把两个不相关的进程联系起来,FIFO就像一个公共通道,解决了不同进程之间的“代沟”.普通的无名管道只能让相关的进程进行沟 ...
- 架构设计经典案例:X窗体系统
X Window在1984年由MIT研发.它的设计哲学之中的一个是:提供机制.而非策略(类似面向对象思想中的"针对接口编程,而不是针对实现编程").机制(mechanism)是指须 ...
- 添加 XML内Rows数据
public static void addItemToXml(string method,string firstKey,string id,string checkName,string refV ...
- SDUT 3503 有两个正整数,求N!的K进制的位数
有两个正整数,求N!的K进制的位数 题目链接:action=showproblem&problemid=3503">http://sdutacm.org/sdutoj/prob ...