ASP.NET AJAX : UPDATEPANEL ET FILEUPLOAD

Luc_arne2 Messages postés 2 Date d'inscription mardi 22 mai 2007 Statut Membre Dernière intervention 22 mai 2007 - 22 mai 2007 à 15:38
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
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/42589-asp-net-ajax-updatepanel-et-fileupload

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;
mnymny Messages postés 1 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 4 janvier 2008
4 janv. 2008 à 09:13
I couldnt download this project
maitredede Messages postés 153 Date d'inscription vendredi 9 août 2002 Statut Membre Dernière intervention 18 septembre 2009
9 oct. 2007 à 13:18
Bonjour JesusOnline,

Je viens de tester ta source qui m'a l'air intéressante. Mais comme les quelques autres, j'ai le HttpContext.Current qui est à null de temps en temps, et du coup ça génère des exceptions. (Pour info, je développe/teste sous VS2008b2, avec le serveur web intégré)

Si un jour tu as le temps, puis-je te demander d'y jeter un oeil svp ?

Merci d'avance

Dédé
guilhemberthalon Messages postés 3 Date d'inscription mercredi 31 janvier 2007 Statut Membre Dernière intervention 13 janvier 2009
19 sept. 2007 à 11:50
Bonjour Cyril,

j'ai un soucis avec ton control :

J'ai encapsulé ton controle dans un User control qui contient un GridView, le controle FileUpload est chargé lors de la mise en édition d'une ligne.

Le fichier s'upload bien, la réponse est retournée correctement (le gridview n'est plus en edition).

Par contre une fois que le controle a été chargé une première fois, le JavaScript continue a s'executer sur chaque Post, la réponse est donc redirigée et les Post ne fonctionne plus correctement.

J'ai reproduit le problème avec l'exemple que tu as posté sur code source (ajout d'un bouton à l'interieur de l'UpdatePanel), le post sur ce bouton ne fonctionne pas correctement, par contre il fonctionne bien sur un bouton à l'exterieur.

Si tu as une piste pour me decoincer je suis preneur,

merci d'avance,

salutations

Guilhem
m1ger Messages postés 7 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 4 juillet 2007
4 juil. 2007 à 23:32
c'est encore moi,

A force de débugage pas à pas, j'avance un peu ...
en fait l'exception n'est pas levée à chaque passage dans le get comme je l'ai affirmé dans le message d'avant.

a priori une fonction utilisant ton objet FileUpload.UploadObject pose problème et pas à chaque passage ... c'est la fonction context_PreSendRequestContent de la classe UploadModule.
Elle est appelée 5 fois durant un upload. et l'erreur sur le HttpContext.Current se produit au 3e et au 5e passage ... sinon tout se passe bien !

bizard bizard ... je ne comprend plus rien !
m1ger Messages postés 7 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 4 juillet 2007
4 juil. 2007 à 20:08
re-salut

merci pour les explications ...

Au passage je suis en train de me demander si justement ce n'est pas le thread qui est différent. Qu'en penses tu ? celà est ce possible ???

Non ce n'est pas réellement le httpcontext qui est à null mais HttpContext.Current (et non HttpContext.Current.Items). Et il est à null à chaque fois.

j'utilise IIS sur ma version pro et cassini (je ne savais pas que ca s'appelai comme ca) sur ma version express.

J'ai testé ta solution avec ie7 et firefox (sur XP et sur Vista) ca ne marche ni dans l'un ni dans l'autre.


Petite précision, si je met des points d'arrêt dans le projet, je me rend compte que la page se recharge en totalité (postback) et non en callback comme j'imagine c'est supposé le faire.
J'ai biensur la dernière version d'ajax.net (et du control Toolkit) installée sur mon poste.
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
4 juil. 2007 à 19:49
"je pense que ca doit être le httpcontext qui n'est pas transféré/reconnu dans la dll du module." ca ne fonctionne pas comme ca :) HttpContext.Current est une propriété statique qui est partagé pour le thread en cours. Ce qui est bizarre c'est que cela voudrais dire que le thread courant n'est pas lié à une requête web, alors que c'est le cas :-/

Il faudrais que je me replonge d'avantage dans le code pour comprendre le problème. Est-ce que le httpcontext est null à chaque fois, es tu sur que c'est le httpcontext qui est null et pas le HttpContext.Current.Items ?

tu utilises IIS ou cassini (le serveur intégré à VS2005) ? sur quel navigateur es tu ? quels OS ?
m1ger Messages postés 7 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 4 juillet 2007
4 juil. 2007 à 19:14
hello,

cette erreur a lieu à chaque chargement, que ce soit le premier, ou en post(call?)back.
Si j'ouvre ta solution telle qu'elle ca me fait l'erreur pareil que si j'insere ton module dans mon propre site.

En effet c'est pour utiliser en production, mais biensur je cherche à comprendre le fonctionnement et éventuellement l'adapter à mes besoins... mais pour ca il faut au moins que je puisse voir le fonctionnement comme tu l'as programmé :o)

pour info :
* j'ai essayé de faire marcher sur la version express et sur la pro de mon travail ... même combat pour les deux.
* j'ai une version 2005 sp1 (en anglais pour la pro, en FR pour l'express), et j'ai aussi testé sans le sp1.
* je pense que ca doit être le httpcontext qui n'est pas transféré/reconnu dans la dll du module.
* ca doit venir d'un problème de configuration de VS/IIS car pour une même source, certains y arrivent et d'autres non.

Merci encore pour ton aide précieuse !

A+
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
4 juil. 2007 à 18:38
@Eviral : le fichier est enregistré nulle part, pour l'enregistrer quelque part c'est comme avec un classique FileUpload c'est à dire en utilisant la méthode file1.SaveAs(fileName);


@NecNec, Samir63, M1ger : je n'arrive pas à reproduire le problème, à quel moment à lieu cette erreur ? lors du premier chargement ? si vous ouvrez la solution contenu dans le zip et faites F5 ca ne fonctionne pas ?

Je rappelle que cette source est un prototype, il faut la voir comme une explication de comment faire marcher les fileupload et les updatepanels. Avant d'utiliser cette astuce sur un site en production je vous conseil de bien comprendre la source.
m1ger Messages postés 7 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 4 juillet 2007
2 juil. 2007 à 16:15
Bonjour,

Je viens de tester ta solution,
j'ai la même exception que les autres au niveau du test : if (HttpContext.Current.Items[typeof(FileUpload)] == null)
Qui serait à priori du au httpContext.Current qui est à Null.

As tu une idée ?
eviral Messages postés 1 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 27 juin 2007
27 juin 2007 à 08:56
Salut,

Je n'ai pas d'erreur, tout semble fonctionner mais ou se trouve mon fichier uploadé ? La page m'affiche le nbr d'octets transférés mais je ne trouve ce fichier uploadé nulle part... Merci

Fred
necnec Messages postés 8 Date d'inscription samedi 19 juin 2004 Statut Membre Dernière intervention 6 décembre 2007
12 juin 2007 à 00:56
Ben j'ai voulu seulemnt recomplier le projet et j'obtiens l'erreur donc je peux pas tester les pages test que t'a mis en exemple
cs_Samir63 Messages postés 3 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 6 juillet 2008
11 juin 2007 à 12:20
J'ai installé votre exemple, et j'ai la même erreur, peut tu voir (La référence d'objet n'est pas définie à une instance d'un objet) ?
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
9 juin 2007 à 17:28
Je n'ai aucune idée d'ou peut venir l'erreur :s mais attention comme je l'ai déjà dit ce code est vraiment à prendre avec les pincettes et il faut bien le comprendre avant de l'utiliser.

Arrives tu à reproduire l'erreur ? si oui dans quelle situations se produit l'erreur ?

Sinon on (peut etre toi) m'a récemment montré http://www.jeffzon.net/Blog/page/Released-Components.aspx, peut etre que ca t'interessera (je n'ai pas testé le code)
necnec Messages postés 8 Date d'inscription samedi 19 juin 2004 Statut Membre Dernière intervention 6 décembre 2007
7 juin 2007 à 12:30
j'ai testé ton code mais j'ai une erreur de
ligne 69 if (HttpContext.Current.Items[typeof(FileUpload)] == null)
+ $exception {"La référence d'objet n'est pas définie à une instance d'un objet."} System.Exception {System.NullReferenceException}
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
22 mai 2007 à 15:54
Bonjour,

Je pense que tu n'as pas compris l'interet de cette source, c'est justement d'uploader un fichier sans faire un classique postback, sans rafraichir toute la page. Le lien que tu me donne permet seulement de ne pas faire de requete Ajax avec un FileUpload mais un classique postback.

Pour plus d'information regarde ici : http://blogs.codes-sources.com/cyril/archive/2007/05/06/ajax-et-upload-part-2-utilisation-d-un-updatepanel-et-d-un-fileupload.aspx
Luc_arne2 Messages postés 2 Date d'inscription mardi 22 mai 2007 Statut Membre Dernière intervention 22 mai 2007
22 mai 2007 à 15:38
Bonjour,

Il me semble qu'il y une façon plus simple de faire celà.
Il suffit d'enregistrer un trigger dans l'updatepanel et de dire que l'on veut un postabck synchrone.

Voir le lien ci-contre pour plus de détail:

http://mobiledeveloper.wordpress.com/2007/05/15/file-upload-with-aspnet-ajax-updatepanel/

Salutations
Rejoignez-nous