在MVC控制器里面使用dynamic和ExpandoObject,实现数据转义的输出
1、数据信息的展示
一般情况下,我们在界面里面展示的信息是相对比较丰富的,尽管我们设计数据表的时候,考虑的是如何精简且避免重复,但是在界面上展示的信息,往往是考虑如何让用户更加方便,因此可能尽可能的展示相关信息。
如对于这样的场景,设备信息作为主要的基础信息,其相关的业务包括设备检查、设备维护、设备报修等信息,如下所示。
基于上面的数据设计,我们如果在展示设备检查、设备维护、设备报修等信息的时候,那么我们一般还需要展示部分的设备基础信息,这样我们更容易了解整个记录数据,但是我们在数据设计的时候,是把它们分开的,因此需要在输出到界面的时候,把它们综合起来。
我以前在《基于MVC4+EasyUI的Web开发框架经验总结(9)--在Datagrid里面实现外键字段的转义操作》介绍过一些数据转义的处理,不过那种方式并不是比较理想的方式。本篇介绍的使用dynamic和ExpandoObject才是我理想的处理模式。
我们来看看我最终通过这种方式实现的界面效果,之后我们再来一步步介绍如何实现这个操作过程的。
2、数据转义的实现
在上面的界面效果里面,我们是基于MVC实现后台的处理,在界面上利用Bootstrap进行展示的(利用EaysUI组件也是类似的处理)。我们分为两部分进行介绍实现的,一部分是采用MVC的输出数据,一部分是界面的展示。
1)MVC的控制器数据处理
在MVC里面,我们一般通过基类的FindWithPager进行数据的分页处理,基于如何在MVC控制器里面实现数据的分页处理,大家感兴趣可以参考《基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用》随笔进行了解。
常规的做法,如果是主表信息,我们可以把它们简单的输出,如下所示。
public override ActionResult FindWithPager(){ //检查用户是否有权限,否则抛出MyDenyAccessException异常base.CheckAuthorized(AuthorizeKey.ListKey); string where = GetPagerCondition();PagerInfo pagerInfo = GetPagerInfo();List<DeviceInfo> list = baseBLL.FindWithPager(where, pagerInfo); //Json格式的要求{total:22,rows:{}} //构造成Json的格式传递var result = new { total = pagerInfo.RecordCount, rows = list }; return ToJsonContentDate(result);}
也就是不需要经过任何转义就直接把查询到的数据列表输出给调用者,由界面进行数据的筛选处理。
如果对于上面提到的设备检查、设备维修等和设备信息相关的,我们就需要利用dynamic和ExpandoObject,把设备信息整合一起提供给界面了,具体代码如下所示。
我们首先对查询的记录进行遍历,把每条记录进行转换,如下所示。
List<ExpandoObject> objList = new List<ExpandoObject>(); foreach (DeviceCheckInfo info in list){ dynamic obj = new ExpandoObject();
注意上面我们定义了List<ExpandoObject>的列表和dynamic obj的对象,这样我们通过动态定义的对象,把我们需要的字段属性加到动态对象里面,然后放到集合里面即可。
完整的分页控制器代码如下所示。
public override ActionResult FindWithPager(){ //检查用户是否有权限,否则抛出MyDenyAccessException异常base.CheckAuthorized(AuthorizeKey.ListKey); string where = GetPagerCondition();PagerInfo pagerInfo = GetPagerInfo();List<DeviceCheckInfo> list = baseBLL.FindWithPager(where, pagerInfo); //设备编码 所属科室 品牌 品类 型号 设备序列号 检查时间 处理人List<ExpandoObject> objList = new List<ExpandoObject>(); foreach (DeviceCheckInfo info in list){ dynamic obj = new ExpandoObject();DeviceInfo deviceInfo = BLLFactory<Device>.Instance.FindByCode(info.DeviceCode); if (deviceInfo != null){obj.Dept = deviceInfo.Dept;obj.Brand = deviceInfo.Brand;obj.Name = deviceInfo.Name;obj.Model = deviceInfo.Model;obj.SerialNo = deviceInfo.SerialNo;}obj.ID = info.ID;obj.DeviceCode = info.DeviceCode;obj.OperateTime = info.OperateTime;obj.Operator = info.Operator;objList.Add(obj);} //Json格式的要求{total:22,rows:{}} //构造成Json的格式传递var result = new { total = pagerInfo.RecordCount, rows = objList }; return ToJsonContentDate(result);}
2)界面的数据展示
上面定义了数据的获取方式,也就是我们需要任何数据都可以在MVC控制器里面,通过动态属性的方式添加到集合对象里面,从而简化了我们界面的处理,我们只需要把获得的信息展示在界面上即可,非常简便了。
界面视图的HTML代码如下所示
<table id="grid" class="table table-striped table-bordered table-hover" cellpadding="0" cellspacing="0" border="0" class="display" width="100%"><thead id="grid_head"><tr><!--设备编码 所属科室 品牌 品类 型号 设备序列号 检查时间 处理人 --><th class="table-checkbox" style="width:40px"><input class="group-checkable" type="checkbox" οnclick="selectAll(this)"></th><th>设备编码</th><th>所属科室</th><th>品牌</th><th>品类</th><th>型号</th> <th>设备序列号</th><th>检查时间</th><th>处理人</th><th style="width:90px">操作</th></tr></thead><tbody id="grid_body"></tbody></table>
我们绑定到界面上,是通过Ajax的方式获取数据,然后绑定显示的,JS代码如下所示。
function SearchCondition(page, condition) { //获取Json对象集合,并生成数据显示内容url = "/DeviceCheck/FindWithPager?page=" + page + "&rows=" + rows;$.getJSON(url + "&" + condition, function (data) {$("#totalCount").text(data.total);$("#totalPageCount").text(Math.ceil(data.total / rows));$("#grid_body").html(""); //<!--设备编码 所属科室 品牌 品类 型号 设备序列号 检查时间 处理人 -->$.each(data.rows, function (i, item) { var tr = "<tr>";tr += "<td><input class='checkboxes' type=\"checkbox\" name=\"checkbox\" value=" + item.ID + "></td>";tr += "<td>" + item.DeviceCode + "</td>";tr += "<td>" + item.Dept + "</td>";tr += "<td>" + item.Brand + "</td>";tr += "<td>" + item.Name + "</td>";tr += "<td>" + item.Model + "</td>";tr += "<td>" + item.SerialNo + "</td>";tr += "<td>" + item.OperateTime + "</td>";tr += "<td>" + item.Operator + "</td>";tr += getActionHtml(item.ID); //获取查看、编辑、删除操作代码tr += "</tr>";$("#grid_body").append(tr);}); //设置分页属性及处理var element = $('#grid_paging'); if(data.total > 0) { var options = {bootstrapMajorVersion: 3,currentPage: page,numberOfPages: rows,totalPages: Math.ceil(data.total / rows),onPageChanged: function (event, oldPage, newPage) {SearchCondition(newPage, condition); //页面变化时触发内容更新 }}element.bootstrapPaginator(options);} else {element.html("");}});}
这样就最终优雅的实现了我们前面介绍的界面效果了。
本文转自 zddnd 51CTO博客,原文链接:http://blog.51cto.com/13013666/1940129
在MVC控制器里面使用dynamic和ExpandoObject,实现数据转义的输出相关推荐
- MVC控制器传递多个实体类集合到视图的方案总结
MVC控制器向视图传递数据包含多个实体类的解决方案有很多,这里主要针对视图模型.动态模型以及Tuple三种方法进行一些总结与记录. 基础集合类:TableA namespace ViewModelSt ...
- Spring Controller – Spring MVC控制器
Spring Controller annotation is a specialization of @Component annotation. Spring Controller annotat ...
- 编写 Spring MVC 控制器的 14 个技巧
欢迎关注方志朋的博客,回复"666"获面试宝典 通常,在Spring MVC中,我们编写一个控制器类来处理来自客户端的请求.然后,控制器调用业务类来处理与业务相关的任务,然后将客户 ...
- ASP.NET MVC 控制器激活(一)
ASP.NET MVC 控制器激活(一) 前言 在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅 ...
- ASP.NET MVC 控制器激活(二)
ASP.NET MVC 控制器激活(二) 前言 在之前的篇幅中,用文字和图像来表示了控制器的激活过程,描述的角度都是从框架默认实现的角度去进行描述的,这样也使得大家都可以清楚的知道激活的过程以及其中涉 ...
- ABP官方文档翻译 6.1.1 MVC控制器
ASP.NET MVC控制器 介绍 AbpController基类 本地化 其他 过滤器 异常处理和结果包装 审计日志 验证 授权 工作单元 介绍 ABP通过Abp.Web.Mvc nuget包集成到 ...
- requestmapping默认是get还是post_编写Spring MVC控制器的14个技巧,你今天get到了吗?...
Java面试笔试面经.Java技术每天学习一点 公众号Java面试 关注我不迷路 原文:http://dzone.com/articles/14-tips-for-writing-spring-mvc ...
- spring_Spring MVC控制器的单元测试:REST API
spring Spring MVC提供了一种创建REST API的简便方法. 但是,为这些API编写全面而快速的单元测试一直很麻烦. Spring MVC测试框架的发布使我们可以编写可读,全面且快速的 ...
- Spring MVC控制器的单元测试:“普通”控制器
本教程的第一部分描述了如何配置使用Spring MVC Test框架的单元测试. 现在是时候动手做,学习如何为"常规"控制器编写单元测试了. 显而易见的下一个问题是: 什么是普通控 ...
最新文章
- 宝塔建站 mysql在哪_宝塔面板建站教程,越详细越好纯小白! - 搜外问答
- Laravel的初始化安装
- java1.5多线程_【Java多线程】JDK1.5并发包API杂谈
- 使用Jquery插件jsonview来展示json数据
- 上帝的玩偶:haXe语言
- 云麦小米华为体脂秤怎么样_测评华为智能体脂秤,比小米智能体重秤贵30元到底差别在哪里?...
- 为什么shell脚本第一行要#!/bin/sh
- java2组随机数的共通数_java随机数产生-指数分布 正态分布 等
- Rust LeetCode 练习:929 Unique Email Addresses
- 浙大python读者验证码_Python实现简单生成验证码功能【基于random模块】
- c语言数据结构学习心得——栈
- 三大抽样分布、正态总体下的抽样分布
- 微信定时自动发送群消息的小工具-python-itchat
- 水电图纸——管道的预埋和盒子的放置-1
- Aryaka荣获2016年度全球最具影响力SD-WAN解决方案奖
- pdf提取其中一页操作方法
- 应用VBS修改注册表大全
- java关于对于word或者pdf文件的批量下载实现,其中包括(Java实现创建word文档模板,根据模板导出word文档)
- 常用dns114.114.114.114与8.8.8.8的区别
- cinder云硬盘备份恢复