2010-10-28 16 views
1

J'ai une page qui possède un contrôle de bouton et plusieurs liens pour télécharger des fichiers. Les liens pour les téléchargements de fichiers pointent vers un gestionnaire générique, puisque ces fichiers sont sécurisés et ils ne seront retournés que si l'utilisateur est connecté.L'événement de clic de bouton ASP.NET ne se déclenchera pas après le fichier de téléchargement de l'utilisateur

Si je charge la page et que je clique sur le bouton sans rien faire d'autre, cela fonctionne bien et l'événement se déclenche Mais si je clique sur un lien et télécharge un fichier, la prochaine fois que je clique sur le bouton, il télécharge simplement le fichier à nouveau, au lieu de déclencher l'événement.

Toute aide serait grandement appréciée. Merci d'avance.

Editer: Voici un exemple de lien généré pour le téléchargement d'un fichier. Ceux-ci sont générés à l'aide d'un contrôle LinkButton ASP.NET dans un contrôle de répéteur ASP.NET.

<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> 

Edit: Voici le code dans le gestionnaire de téléchargement.

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

Pouvez-vous nous fournir le code qui télécharge en fait le fichier? Quel que soit le code qui se trouve derrière ce lien qui a téléchargé le fichier. – BeemerGuy

+0

Merci pour votre réponse. J'ai édité la question et joint le code dans mon gestionnaire. – user326502

Répondre

0

Votre navigateur met en cache la demande. La requête n'atteint jamais le serveur ... vous pouvez vérifier vos logs de demande pour le confirmer.

Pour désactiver, vous devez ajouter cette ligne de code dans votre réponse:

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