我有一个页面,它有一个按钮控件和几个下载文件的链接。文件下载的链接指向通用处理程序,因为这些文件是安全的,只有在用户登录时才会返回它们。
如果我加载页面并单击按钮而不执行任何其他操作,则工作正常,并且事件将触发。但是,如果我单击一个链接并下载文件,下次单击该按钮时,它只会再次下载该文件,而不是触发该事件。
非常感谢任何帮助。提前谢谢。
编辑:以下是为下载文件而生成的示例链接。这些是使用ASP.NET转发器控件中的ASP.NET LinkButton控件生成的。
<a id="ctl00_Content_LessonFileRepeater_ctl06_FileLinkButton" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$Content$LessonFileRepeater$ctl06$FileLinkButton", "", false, "", "Handlers/FileDownload.ashx?id=02142fe4-12ab-43bf-82f4-5a72b604ab7b", 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 :(得分:0)
您的浏览器正在缓存请求。该请求永远不会到达服务器...您可以检查您的请求日志以确认这一点。
要禁用此功能,您需要在响应中添加以下代码:
context.Response.Cache.SetCacheability(HttpCacheability.NoCache)