2010-04-27 5 views
3

J'essaie de mettre à niveau un projet Web asp.net C# de la version 2.0 vers la version 3.5. Lorsque je fais cela, le script côté client écrit à l'aide de RegisterStartupScript n'est pas rendu sur la page du client.RegisterStartupScript ne fonctionne pas après la mise à niveau vers la structure 3.5

Cela fonctionne parfaitement lorsque je compile pour 2.0, et pour 3.0, mais pas quand je compile pour 3.5.

Voici le code qui ne se rend:

Page myPage = (Page)HttpContext.Current.Handler; 
ScriptManager.RegisterStartupScript(myPage, myPage.GetType(), "alertscript", "alert('test');", true); 

Ceci est appelé à partir d'un projet de classe, et non le projet Web lui-même, ce qui est la raison pour laquelle j'utilise le HttpContext.Current.Handler .

Il n'y a aucune erreur générée par le compilateur, le CLR, et il n'y a pas d'erreurs JavaScript côté client.

Si je fais une recherche pour le "alertscript" dans ma page rendue, le code ci-dessus n'est pas là.

Quelqu'un a des idées sur ce qui se passe?

-Edit-

Cela semble être un problème quand je suis en train d'enregistrer le script d'un projet externe.

Si j'utilise exactement le même code dans un fichier de classe dans le projet web (pas le code derrière), cela fonctionne. Cependant, si je fais un appel à une méthode dans une classe d'un autre projet, cela ne fonctionne pas.

Est-ce que ScriptManager.RegisterStartupScript n'est pas enregistré correctement s'il est exécuté ailleurs que dans le projet Web lui-même?

-Edit2-

Pour ajouter à cela, j'ai fait ce qui suit:

  1. a enregistré un script d'alerte de mon projet web classe
  2. Appelé une méthode dans une classe externe et simplement enregistré un autre script d'alerte
  3. Enregistré un autre script d'alerte de ma classe de projet web

Après tout cela est fait, si je vois la variable: myPage.ClientScript._registeredClientStartupScripts du projet web, je vois ces trois nouvelles entrées, une pour chacun des scripts que je viens d'enregistrer. Donc, je crois que tout a été ajouté correctement. Cependant, quand je laisse la page finir de s'exécuter et que je regarde les résultats dans fiddler, je vois seulement les deux qui ont été réellement enregistrés du projet Web lui-même, et celui de la classe externe ne le fait jamais. Gardez à l'esprit que tout fonctionne parfaitement dans les frameworks 2.0 et 3.0, mais pas dans 3.5.

Répondre

1

Le problème a été dans les projets externes.

Si vous modifiez un projet Web pour utiliser Framework 3.5, la référence dll System.Web.Extensions a été automatiquement mis à jour à la version 3.5.

Ce n'est pas le cas pour les projets non-Web, probablement parce qu'ils ont été ajoutés manuellement.

Les projets externes ont été toujours référence la version 2.0 de la dll, même si je changé le projet de compilation avec 3,5.

Tout a fonctionné après avoir changé manuellement la référence à la version 3.5.

+0

Excellent, je suis sûr que cela ne va jamais nous attraper à nouveau :) –

1

Deux choses

1- Vos arguments à l'appel devrait probablement être quelque chose comme

ScriptManager.RegisterStartupScript(myPage, myPage.GetType(), "alertscript", "alert('test');", true); 

Le premier argument est la référence au contrôle l'enregistrement du bloc de script et le second est le type du contrôle enregistrant le bloc de script.

2- Utilisez-vous cela dans un UpdatePanel?
http://msdn.microsoft.com/en-us/library/bb359558.aspx

blocs de script de démarrage qui sont enregistrés en utilisant cette méthode sont envoyés à la page que lorsque le contrôle qui enregistre le bloc est à l'intérieur d'un contrôle UpdatePanel qui est mis à jour

+0

Merci pour la réponse. J'ai d'abord eu le type défini correctement. J'ai essayé de le mettre dans une chaîne pour voir si cela faisait une différence, et j'ai oublié de le changer avant de coller dans le code. Ce contrôle qui déclenche cette logique est à l'intérieur d'un UpdatePanel, et fonctionne très bien pour cadre 3.0. Y a-t-il des changements à ce comportement de framework en 3.5 que vous connaissez? – AaronS

+0

@AaronS, rien de ce que je sais de qui affecterait l'enregistrement du script. Avez-vous essayé de tester l'enregistrement directement sur le contrôle plutôt que sur la fonction de votre bibliothèque, juste pour vérifier si cela fonctionne? –

+0

Je travaille à partir du projet web. Voir la mise à jour ci-dessus. – AaronS

Questions connexes