关于VerifyRenderingInServerForm方法的思考(转)
问题背景
在BS项目中,把分页的gridview的数据(不只是导出当前页的数据),全部导出为Excel文件(这里特指绘制页面的方式),碰到三个问题;
问题1,身份证编号数字不能正常显示(后面几位变成0并且会显示成科学计算符)
问题2,虽然,我在demo中,直接把gridview的数据绘制出来,结果页面上的所有控件都绘制出来了
解决问题
第一个问题很好解决,google了下,发现将 GridView 导出Excel 时,身份证号码被改为科学计数法显示,所有,我们只要改变一下身份证编号的数据类型就可以了
比如改成字符类。
我们在导出的时候把类型改掉
//注意gridView.Rows[count].Cells[3]
for (int count = 0; count < gridView.Rows.Count; count++)
{
gridView.Rows[count].Cells[3].Text = "'" + gridView.Rows[count].Cells[3].Text;
}
这里,我把数字类型改成了字符类型,而且在身份证编号前加了个“'”号,这样就解决了数字过长,尾数都变成0的问题,而且也解决了身份证号码被改为科学计数法显示的问题。
至于第二个问题,比较麻烦,我跟踪了好几次,都没有发现原因,先来看完整的demo
<summary>
/// 导出数据到Excel、Word表格
/// </summary>
/// <param name="gridView"></param>
/// <param name="hideColumns">需要隐藏的列的索引</param>
/// <param name="fileExt">文件名后缀</param>
public static void Export(System.Web.UI.WebControls.GridView gridView, int[] hideColumns, string fileExt)
{
HttpContext context = HttpContext.Current;
try
{
context.Response.ClearContent();
context.Response.Clear();
context.Response.ContentEncoding = System.Text.Encoding.UTF7;
context.Response.AddHeader("content-disposition", string.Format("attachment; filename=Page{0}.{1}", gridView.PageIndex + 1, fileExt));
switch (fileExt.ToLower())
{
case "xls":
default:
context.Response.ContentType = "application/excel";
break;
case "doc":
context.Response.ContentType = "application/word";
break;
}
System.IO.StringWriter sw = new System.IO.StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
//注意gridView.Rows[count].Cells[3]
for (int count = 0; count < gridView.Rows.Count; count++)
{
gridView.Rows[count].Cells[3].Text = "'" + gridView.Rows[count].Cells[3].Text;
}
//for (int i = 0; i < gridView.Controls.Count; i++)
//{
// if (gridView.Controls[i].GetType() == typeof(Button))
// {
// gridView.Controls.Remove(gridView.Controls[i]);
// }
//}
if (hideColumns != null)
{
foreach (int columnIndex in hideColumns)
{
if (columnIndex < gridView.Columns.Count)
{
gridView.Columns[columnIndex].Visible = false;
}
}
}
//如果HeaderRow里的控件是button的话,则把它替换成文本
foreach (TableCell tc in gridView.HeaderRow.Cells)
{
// TableCell里的每个Control
foreach (Control c in tc.Controls)
{
// 如果控件继承自接口IButtonControl
if (c.GetType().GetInterface("IButtonControl") != null && c.GetType().GetInterface("IButtonControl").Equals(typeof(IButtonControl)))
{
// 如果该控件不是“导出Excel”按钮则把button转换成文本
tc.Controls.Clear();
tc.Text = ((IButtonControl)c).Text;
}
}
}
//清空页脚控件
if (gridView.BottomPagerRow!=null)
gridView.BottomPagerRow.Controls.Clear();//.f.Cells[2].Controls.Clear();
// 将服务器控件的内容输出到所提供的 System.Web.UI.HtmlTextWriter 对象中
gridView.RenderControl(htw);
context.Response.Write(sw.ToString());
context.Response.End();
}
catch (Exception ex)
{
}
}
注意,红色和黄色的两行代码,其作用就是把gridview的页脚控件清除掉,不导出到Excel文件,以免影响Excel的美观。
事实上,很多情况,都不是我们一开始就能全部考虑得到的,比如我在清除gridview的页脚控件的时候,忘记考虑gridview有时候,数据不满一页的时候,就没有页脚控件,如果不加判断if (gridView.BottomPagerRow!=null),在清除页脚控件的时候,肯定会报null异常。
事实上,只要在发生异常,代码的调度直接进入catch块中,那么我们自定义的输出代码就不会执行context.Response.Write(sw.ToString()),系统转而把整个页面都输出来了,所有我们就会看到不需要的一些控件也被导出来了。
事实上,问题到此,并没有完全解决,还是会把真个页面上的控件都导出来。
我们先休息一下,我们会发现,当我们点击导出Button的时候,响应给我们的输出流是一个excel页,而非默认的aspx页(context.Response.ContentType = "application/excel";),这样新的问题又来了,页面上的控件在rendering的时候,都会调用VerifyRenderingInServerForm方法,来检查当前控件是否在ServerForm标记内(调试过,确实如此)。很明显,我们输出的文档类型是"application/excel",而非默认的"text/html"类型,控件当然不在Form之中,因此也会抛出异常(控件不在Form中的异常),结果,系统又调用默认的输出流,把整个页都导出来了(shit)。
这个问题,很好解决,重写VerifyRenderingInServerForm方法,什么事也不干(也就是阻止系统调用默认的VerifyRenderingInServerForm方法)
public override void VerifyRenderingInServerForm(System.Web.UI.Control control)
{
//base.VerifyRenderingInServerForm(control);
}
总结
问题的关键是导出excel的时候,输出文件已经不是合法的aspx文件,我们唯一的办法,就是阻止系统掉用控件的检查方法,防止抛出异常,导致系统调用默认的输出方法,从而导致整个页面的控件都被导出。
转载于:https://www.cnblogs.com/cuihongyu3503319/archive/2012/04/06/2434148.html
关于VerifyRenderingInServerForm方法的思考(转)相关推荐
- 商业模式新生代_商业模式设计方法视觉化思考——《商业模式新生代》笔记之九...
前言:慢慢来,比较快."财不入急门","您赚不到认知之外的钱"点击头像关注我,和您一起每天学习一点商业思维,提升自己的商业认知.我始终相信,方向对了,认知到了, ...
- 高维数据中特征筛选方法的思考总结——单变量分析筛选法
基因组学.转录组学.蛋白组学及代谢组学等生信问题(高通量数据)中,面临的第一步往往就是降维(或者说筛选特征).降维方法分为两大类:单变量分析降维法.多变量分析降维法.单变量降维常常使用FC值或者P值, ...
- 高维数据中特征筛选方法的思考总结——多变量分析筛选法
前言:之前的文章(高维数据中特征筛选方法的思考总结--单变量分析筛选法)中,对单变量分析筛选变量进行了初步考量,本文将进一步总结多变量分析筛选法.由于本文多处摘录网上的博客,只是进行了归纳整理,因此笔 ...
- Unreal Engine 4 —— 异步加载关卡的实现方法及思考
这篇文章介绍了在ue4中实现异步加载关卡的方法,以及我对应的思考. 背景 在很多游戏中都有用到关卡的异步加载,关卡的异步加载指的是在游戏的某个阶段,使用多线程的方法进行新关卡对应的内容加载.从而能够免 ...
- 安全产品研发与落地的一些方法与思考
一.读前必看 1.写这篇文章的心理动机 工作几年的时间里一直在从事技术相关的工作,自己闲暇之余和工作经历经常会有脉脉上所说的工作如同拧螺丝一样的工作.从个人角度的很长时间的确给我造成了很大的困扰,毕竟 ...
- 对抗训练浅谈:意义、方法和思考(附Keras实现)
©PaperWeekly 原创 · 作者|苏剑林 单位|追一科技 研究方向|NLP.神经网络 当前,说到深度学习中的对抗,一般会有两个含义:一个是生成对抗网络(Generative Adversari ...
- 积分上下限无穷_数学方法的思考和存在无穷多个孪生素数证明的思路
高斯提出了素数定理, 但是没有证明,一百年后数学家雅克·阿达马与德拉瓦·莱普森,分别独立证 明了素数定理.他们用的是复分析及黎曼函数.此时大数学家哈代就指出" 对不起,素数定理没有初等证明& ...
- 由Object.prototype.toString.call( )引发关于toString( )方法的思考
引言 前端面试中有这么一道经典的问题,如何判断一个对象是否为数组? ES5提供了一个确定对象是否为数组的函数 Array.isArray(object); 复制代码 其中,object是必须的,表示要 ...
- 用卡尔曼滤波处理工程数据的方法与思考with基于GPS与INS组合导航的滤波模型仿真
Say Something: 我猜能看到这个小文章的小伙伴估计已经为了学卡尔曼滤波费劲了头脑,查遍了资料.而且我推测这里的大多数人在之前的学习过程中总是发现那些资料里总是用一些理想的模型举例子,而且针 ...
最新文章
- 在domain中验证cron表达式
- Spring - Java/J2EE Application Framework 应用框架 第 18 章 使用Quartz或Timer完成时序调度工作
- 老股民经验之谈 这些股票买入必死无疑
- JavaScript入门(part1)--初识JavaScript
- 全链路追踪竟然如此简单? bytebuddy搭建全链路追踪的demo 附代码
- wltc循环多少公里_原来所有车都烧机油!但是烧多少才算正常你知道吗?
- mysql的错误代码4999_mysql相关错误以及对应解决方法总结
- jquery效果插件网址
- 吴恩达教授机器学习课程笔记【三】广义线性模型(1)-指数族分布
- 好用不贵的蓝牙耳机有哪些?三百以内好用的蓝牙耳机推荐
- 解决学校断网,突破天翼校园,实现共享wifi以及linux下无天翼校园客户端
- 二进制包20分钟快速安装部署 Kubernetes v1.14.0 集群
- Elasticsearch版本客户端与服务端版本不一致问题
- HTML小游戏2—— 2048网页版(附完整源码)
- 肯德基中国门店将限时发售植物肉汉堡
- nmap下载和扫描教程
- 三星nfc添加门禁卡实测有效_今天才知道!iPhone手机还能变成门禁卡,60秒就能实现...
- 计算机云共享盘,搭建私人云网盘:局域网访问共享数据
- StarUML使用文档
- gs地图开发_当红小生东风风神奕炫GS 有颜有型
热门文章
- 一台新云主机nodejs项目部署过程
- es6 混合commjs_Webpack打包ES6和CommonJs混合React
- python在建筑施工方面的应用_有哪些关于 Python 在建筑中的应用和教程?
- 【Flink】Flink kafka Spark 如何实现数据有序性
- 【kafka】kafka Selector Timeout of expired before the position for partition could be determined
- 【Flink】Flink No JAAS configuration section named Client ERROR:Authentication failed
- 如何让JSON只从Model中输出一部分
- navicat为什么收费,用的人还是不少
- 虚拟机的三大服务器启动不了,Win7系统下共享虚拟机提示VMware Workstation Server共享服务不能启动如何解决?...
- mri计算机系统,MRI设备