2010-10-28 91 views
1

我有一个页面,它有一个按钮控件和几个链接来下载文件。文件下载的链接指向通用处理程序,因为这些文件是安全的,只有在用户登录后才会返回。ASP.NET按钮单击事件在用户下载后不会触发文件

如果我加载页面并单击按钮而不做任何其他工作,它会正常工作,事件发生。但是如果我点击一个链接并下载一个文件,下次我点击该按钮时,只需再次下载文件,而不是触发该事件。

任何帮助将不胜感激。提前致谢。

编辑:下面是为下载文件生成的示例链接。这些是使用ASP.NET中继器控件中的ASP.NET LinkBut​​ton控件生成的。

<a id="ctl00_Content_LessonFileRepeater_ctl06_FileLinkButton" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$Content$LessonFileRepeater$ctl06$FileLinkButton&quot;, &quot;&quot;, false, &quot;&quot;, &quot;Handlers/FileDownload.ashx?id=02142fe4-12ab-43bf-82f4-5a72b604ab7b&quot;, false, true))">My File.zip</a> 

编辑:这是在下载处理程序的代码。

public void ProcessRequest(HttpContext context) 
    { 
     if (!AuthenticationHelper.UserIsLoggedIn) 
      RedirectToNotAuthorizedPage(context); 
     string fileId = context.Request.QueryString["id"]; 
     if (!Regex.IsMatch(fileId, RegexConstants.Guid)) 
      RedirectToNotAuthorizedPage(context); 
     else 
     { 
      var lessonFileRepository = new LessonFileRepository(); 
      LessonFile file = lessonFileRepository.GetById(new Guid(fileId)); 
      if (file == null) 
       RedirectToNotAuthorizedPage(context); 
      else 
      { 
       if (!AuthenticationHelper.CurrentUser.AuthorizedLessons.Any(i => i.LessonFiles.Any(j => j.LessonFileId == file.LessonFileId))) 
        RedirectToNotAuthorizedPage(context); 
       else 
       { 
        context.Response.Buffer = true; 
        context.Response.Clear(); 
        string encodedFileName = context.Server.UrlEncode(file.FileName + '.' + file.FileExtension); 
        encodedFileName = encodedFileName.Replace(@"+", 
                   context.Request.Browser.Browser == "IE" 
                    ? @"%20" 
                    : @"_"); 
        context.Response.AddHeader("content-length", GetFileLength(context, file.Lesson.LessonNumber, file.FileName+"."+file.FileExtension)); 
        context.Response.AddHeader("content-disposition", "attachment; filename=" + encodedFileName + ";"); 
        context.Response.ContentType = "application/" + GetContentType(file.FileExtension) + ";"; 
        context.Response.WriteFile("~/LessonFiles/Lesson" + file.Lesson.LessonNumber + "/" + 
               file.FileName + '.' + file.FileExtension); 
        context.Response.End(); 
       } 
      } 
     } 
    } 

    protected string GetFileLength(HttpContext context, int lessonNumber, string fullFileName) 
    { 
     var fileData = File.OpenRead(context.Server.MapPath("~/LessonFiles/Lesson" + lessonNumber + "/" + fullFileName)); 
     return fileData.Length.ToString(); 
    } 
+0

你能为我们提供实际下载文件中的代码?无论在下载该文件的链接后面运行的代码如何。 – BeemerGuy 2010-10-28 02:34:26

+0

感谢您的回复。我编辑了问题并将代码附加在我的处理程序中。 – user326502 2010-11-04 13:27:59

回答

0

您的浏览器正在缓存请求。请求永远不会到达服务器......您可以检查您的请求日志以确认此事。

要禁用它,你需要添加这行代码在你的回应:

context.Response.Cache.SetCacheability(HttpCacheability.NoCache) 
相关问题