Luc_arne2
Messages postés2Date d'inscriptionmardi 22 mai 2007StatutMembreDernière intervention22 mai 2007
-
22 mai 2007 à 15:38
alainhol
Messages postés1Date d'inscriptionmercredi 19 novembre 2008StatutMembreDernière intervention21 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.
alainhol
Messages postés1Date d'inscriptionmercredi 19 novembre 2008StatutMembreDernière intervention21 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és4Date d'inscriptionjeudi 6 octobre 2005StatutMembreDernière intervention18 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 :
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és4Date d'inscriptionjeudi 6 octobre 2005StatutMembreDernière intervention18 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és1Date d'inscriptionjeudi 3 décembre 2009StatutMembreDernière intervention17 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és56Date d'inscriptionmercredi 29 septembre 2004StatutMembreDernière intervention 4 janvier 20101 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és1Date d'inscriptionvendredi 4 janvier 2008StatutMembreDernière intervention 4 janvier 2008 4 janv. 2008 à 09:13
I couldnt download this project
maitredede
Messages postés153Date d'inscriptionvendredi 9 août 2002StatutMembreDernière intervention18 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és3Date d'inscriptionmercredi 31 janvier 2007StatutMembreDernière intervention13 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és7Date d'inscriptionsamedi 5 février 2005StatutMembreDerniè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és7Date d'inscriptionsamedi 5 février 2005StatutMembreDerniè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és6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 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és7Date d'inscriptionsamedi 5 février 2005StatutMembreDerniè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és6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 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és7Date d'inscriptionsamedi 5 février 2005StatutMembreDerniè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és1Date d'inscriptionmercredi 12 novembre 2003StatutMembreDernière intervention27 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és8Date d'inscriptionsamedi 19 juin 2004StatutMembreDerniè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és3Date d'inscriptionmardi 13 février 2007StatutMembreDerniè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és6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 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 ?
necnec
Messages postés8Date d'inscriptionsamedi 19 juin 2004StatutMembreDerniè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és6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 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.
Luc_arne2
Messages postés2Date d'inscriptionmardi 22 mai 2007StatutMembreDernière intervention22 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.
21 déc. 2009 à 14:36
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
18 déc. 2009 à 16:37
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);
}
18 déc. 2009 à 12:02
17 août 2009 à 19:40
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.
28 mai 2009 à 21:48
// on stock l'id de l'iframe dans le champ cach?
$get(CS._FileUpload.K_HiddenFieldName).value = '1|' + iframeID;
4 janv. 2008 à 09:13
9 oct. 2007 à 13:18
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é
19 sept. 2007 à 11:50
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
4 juil. 2007 à 23:32
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 !
4 juil. 2007 à 20:08
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.
4 juil. 2007 à 19:49
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 ?
4 juil. 2007 à 19:14
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+
4 juil. 2007 à 18:38
@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.
2 juil. 2007 à 16:15
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 ?
27 juin 2007 à 08:56
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
12 juin 2007 à 00:56
11 juin 2007 à 12:20
9 juin 2007 à 17:28
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)
7 juin 2007 à 12:30
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}
22 mai 2007 à 15:54
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
22 mai 2007 à 15:38
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