【问题标题】:ASP.NET Button Click Event Won't Fire After User Downloads File用户下载文件后,ASP.NET 按钮单击事件不会触发
【发布时间】:2010-10-28 02:26:24
【问题描述】:

我的页面有一个按钮控件和几个下载文件的链接。文件下载的链接指向通用处理程序,因为这些文件是安全的,并且只有在用户登录时才会返回。

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

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

编辑:这是为下载文件而生成的示例链接。这些是使用 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();
    }

【问题讨论】:

  • 能否提供实际下载文件的代码?下载文件的链接后面运行的任何代码。
  • 感谢您的回复。我编辑了问题并将代码附加到我的处理程序中。

标签: asp.net events download postback


【解决方案1】:

您的浏览器正在缓存请求。该请求根本不会到达服务器...您可以检查您的请求日志以确认这一点。

要禁用此功能,您需要在响应中添加这行代码:

context.Response.Cache.SetCacheability(HttpCacheability.NoCache)

【讨论】:

    猜你喜欢
    • 2012-01-19
    • 2016-04-25
    • 2012-09-12
    • 2019-06-22
    • 2010-10-21
    • 2011-12-02
    • 1970-01-01
    • 2020-02-20
    • 2020-05-01
    相关资源
    最近更新 更多