Asp.net ajax : updatepanel et fileupload

0/5 (21 avis)

Vue 33 375 fois - Téléchargée 2 308 fois

Description

Pour des raisons de sécurité, le contrôle FileUpload ne fonctionne pas à l'intérieur d'un UpdatePanel. En effet l'UpdatePanel fait ses requêtes de mis à jour partiel en utilisant XmlHttpRequest et l'on ne peut pas envoyer de fichier via cet objet.

Ce code rend possible l'utilisation d'un FileUpload à l'intérieur d'un UpdatePanel, pour cela j'ai créer un nouveau contrôle qui hérite de FileUpload ainsi qu'un HttpModule qui modifie directement le flux de la réponse http. On peut utiliser le classique contrôle FileUpload, l'utilisation d'un tagmapping configuré au niveau du web.config remplace le classique FileUpload par mon FileUpload.

Conclusion :


Ceci est un prototype, il doit surement se cacher de nombreux bugs.

Dans le zip, il y a 2 projets : un projet qui contient le FileUpload et un autre qui contient une website de test. Pour l'instant le controle UpdateProgress ne fonctionnera pas si vous utiliser un FileUpload dans votre page.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
alainhol Messages postés 1 Date d'inscription mercredi 19 novembre 2008 Statut Membre Dernière intervention 21 décembre 2009
21 déc. 2009 à 14:36
On ne peut utiliser un controle FileUpload en asynchpostback dans un UpdatePanel, seulement en postback, ce qui bien sur... ce que je fait moi c'est:

dans la page ou j'ai besoin d'utiliser le FileUpload, j'insere un controle Literal, ensuite, dans la page de code j'initialise le literal avec litrale1.Text = ""; en passant les parametres que j'ai besoin a cette page

Ensuite, dans le fichier MyFileUpload.aspx j'insere les controls habituels avec le fileupload en SYNCHPOST et voila le tour est jouer. le meme effet que si vous etiez dans la meme page utilisant le modele asynchpostback

:o)

Alain
C _ Line Messages postés 4 Date d'inscription jeudi 6 octobre 2005 Statut Membre Dernière intervention 18 décembre 2009
18 déc. 2009 à 16:37
Dans la classe FileUpload, il y a un soucis lorsqu'on souhaite utiliser plusieurs FileUpload sur une même page. Il faut changer la façon de construire le référencement au javascript dans la méthode prerender de la classe FileUpload :

protected override void OnPreRender(EventArgs e)
{
if (ScriptManager.GetCurrent(this.Page) != null && ScriptManager.GetCurrent(this.Page).EnablePartialRendering)
{
ScriptManager.GetCurrent(this.Page).RegisterScriptControl<FileUpload>(this);

if (!UploadObject.IsFileUploadRegistered)
{
UploadObject.IsFileUploadRegistered = true;
StringBuilder sb = new StringBuilder();
sb.Append("Sys.Application.add_init(function(){CS.FileUpload.addFileUploadElements([");
int i = 0;
foreach (FileUpload fileUpload in UploadObject.FileUploads)
{
if (i > 0)
sb.Append(",");
sb.Append("'").Append(fileUpload.ClientID).Append("'");
i++;
}
sb.Append("])});");
ScriptManager.RegisterStartupScript(this, typeof(FileUpload), "RegisterFileUploads", sb.ToString(), true);
}
}
base.OnPreRender(e);
}
C _ Line Messages postés 4 Date d'inscription jeudi 6 octobre 2005 Statut Membre Dernière intervention 18 décembre 2009
18 déc. 2009 à 12:02
Mecri beaucoup, le code fonctionne très bien. Suffit de protéger les paramètres d'entrée, comme dans toute méthode. HttpContext.Current est effectivement nul, il faut juste ajouter les test comme l'explique Gyzmau. Temps de correction : 30 secondes ? Sinon le tout fonctionne très bien, c'est tout ce que je recherchais, ça me fait gagner beaucoup de temps. Et Jesus, jamais eu le temps de te remercier, mais tes commentaires sur les forums m'ont déjà aidée par le passé donc thx pour ton travail :)
gyzmau Messages postés 1 Date d'inscription jeudi 3 décembre 2009 Statut Membre Dernière intervention 17 août 2009
17 août 2009 à 19:40
Bonjour,

après quelques recherches j'ai une piste.
Si l'évènement ou le Context courant est null est appelé après EndRequest alors il est a null.
Et si on désactive le buffer on passe avant
((HttpApplication)sender).Response.Buffer = false;
Mais je sais pas pourquoi il y avait tjs une erreur sur le context qui trainait.

Au final on s'aperçoit que le httpContext est null mais le Application.context lui est valide.

Pour le moment si je rajoute les lignes suivantes dans context_PreSendRequestHeaders et context_PreSendRequestContent tous marchera:
if (HttpContext.Current == null)
HttpContext.Current = application.Context;
/*application correspond a notre HttpApplication évidement*/

Par contre ca explique toujours pas pourquoi le httpContext.Current se retrouve a null.

Comme tjs c'est de la bidouille quand même car je sais pas le pkoi du comment alors attention en prod.
dymsbess Messages postés 56 Date d'inscription mercredi 29 septembre 2004 Statut Membre Dernière intervention 4 janvier 2010 1
28 mai 2009 à 21:48
L'erreur est signalée à cet endroit quand on utilise la console d'erreur javascript dans Mozilla :

// on stock l'id de l'iframe dans le champ cach?
$get(CS._FileUpload.K_HiddenFieldName).value = '1|' + iframeID;

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.