Asp.net ajax : updatepanel et fileupload

Soyez le premier à donner votre avis sur cette source.

Vue 32 932 fois - Téléchargée 2 228 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
-
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
-
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
-
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
-
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 -
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.