当单击导出文件的时候,会弹出下载器页面,如下所示:
在单击导出按钮和出现下载器之间会弹出一个页面,但是会很快先消失。可是偶尔单击导出按钮的时候,不会出现下载器下载文件而是弹出我写的登陆页面,如下图所示:
我怀疑出现又消失的那个页面就是这个登陆页面,我写的导出excel方法如下:
private static void ExportToExcel(GridView gvw, string title, string filename) { string fileName; HttpContext.Current.Response.Buffer = true; HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ClearHeaders(); fileName = string.Format("{0:yyyy-MM-dd_HH_mm}.xls", filename + DateTime.Now); HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"; HttpContext.Current.Response.Charset = "UTF-8"; HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8; gvw.EnableViewState = false; StringWriter tw = new System.IO.StringWriter(); HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw); gvw.RenderControl(hw); if (!string.IsNullOrEmpty(title)) { HttpContext.Current.Response.Write("<b><center><font size=3 face=Verdana color=#0000FF>" + title + "</font></center></b>"); } HttpContext.Current.Response.Write(tw.ToString()); HttpContext.Current.Response.Flush(); HttpContext.Current.Response.Close(); HttpContext.Current.Response.End(); gvw.Dispose(); tw.Dispose(); hw.Dispose(); gvw = null; tw = null; hw = null; }
完全没有弹出页面的语句,可是调试的时候先弹出那个出现又消失的页面,在进入此方法。这是怎么回事?
更奇怪的是在本地运行的时候弹出登陆页面不导出excel文件,可是网站配置到服务器上在服务器上运行的时候,就可以导出excel文件,虽然还是会闪现出一个页面,但是不会跳转到登陆页面。
您的代码很有趣,但是只是描绘了下载文件的生成及下载导向问题(不过xls里头为什么会有html?),我想您应该整体考虑下,您从单击按钮到下载的全过程。
包括一些隐式的过程,比如截获器等,从您的描述中看,确实似乎是权限的问题,您提出您使用了form表单验证,那么您的实际配置情况是配置正确的吗?
至于显示页面并关闭,我倒是认为是正常的,因为您的链接并不会本身就告诉您他是干什么的,浏览器在访问这个链接之后才会明确是一个下载的文件。我不认为这有什么问题。需要花更多心思考虑的似乎是您配置的身份校验为什么会将这个链接移除在外……
可能与身份验证有关,你用的是什么方式的身份验证?
我用的是form表单验证,经过验证弹出又马上消失的页面是又开了一个导出文件的页面,可能下载就是基于这个页面的,但是这个页面自身却失去了原来的身份,就跳到了登陆页面,没法下载,这是我的推测。