Lu,
volià le problème du téléchargement direct depuis un formulaire ajaxifié est résolu...Le téléchargement marche grâce au httpHandler... Ca n'aura pas été une mince affaire de le mettre en oeuvre...
Voilà donc comment j'ai procédé, en espérant que ce soit le plus juste possible et que ça puisse aider les autre...
Je garde exprès le nom que j'ai donné à ma classe et mes variables pour garder une certaine cohérence, mais c'est juste un exemple...
Tout d'abord, j'ai créé une classe dans le répertoire asp.net App_Code DownloadFileHandler :
using System.Web;
using DotNetNuke.Common.Utilities;
using System.Web.SessionState;
using System;
namespace Sedoc.Modules.BaseReglementaire
{
public class DownloadFileHandler : IHttpHandler
{
public DownloadFileHandler()
{
}
public void ProcessRequest(HttpContext context)
{
HttpRequest Request = context.Request;
// Controle qu'il y a bien les deux paramètres non nuls
if ((Int32.Parse(Request.QueryString["FileID"]) != DotNetNuke.Common.Utilities.Null.NullInteger) && (Int32.Parse(Request.QueryString["PortalID"]) != DotNetNuke.Common.Utilities.Null.NullInteger))
{
int iFileId = Int32.Parse(Request.QueryString["FileID"]);
int iPortalId = Int32.Parse(Request.QueryString["PortalID"]);
// Téléchargement du fichier
FileSystemUtils.DownloadFile(iPortalId, iFileId, false, true);
}
}
public bool IsReusable
{
// To enable pooling, return true here.
// This keeps the handler in memory.
get { return false; }
}
}
}
Ensuite je fais mon appel dans le code sur lors de l'évènement lié au clic du téléchargement :
// Construction de la QueryString en intégrant les id du portail et du fichier
string sQueryString = "window.open('Download.ashx?FileID=" + iFileId.ToString() + "&PortalID=" + this.PortalId + "');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "download", sQueryString, true);
]N.B. : Je ne sais juste pas trop à quoi sert le "download" qui est censé être une clé (string key), mais de quoi ?? passé en paramètre dans le RegisterStartupScript mais ça fonctionne à merveille, alors...
Enfin, j'ai déclaré le httpHandler dans le web.config dans la section <httpHandlers> comme ceci :
<add verb="*" path="*.ashx" type="Sedoc.Modules.BaseReglementaire.DownloadFileHandler"/>
Voilà, je tenais à faire partager mon retour d'expérience car je suis resté bloqué plus de deux jours sur un problème qui maintenant connu me prendra 30 mn au plus à remettre en place si le cas se représente :)
Par contre si quelqu'un à une idée ou pourrait me dire comment faire en sorte pour que la déclaration du httpHandler dans le web.config soit faite par le script d'installation du module (.dnn), je lui en serais énormément reconnaissant... Et si ce n'est pas possible, tant pis il faudra le faire à la main...
++