UserControl avec UpdatePanel créer par programmation ScriptManager possible?
Je voudrais utiliser un UpdatePanel dans mon UserControl. Le problème est la .page aspx le contrôle est tombé sur n'aura PAS de ScriptManager. J'ai besoin de créer le ScriptManager dans le contrôle UserControl. Toutefois, si le contrôle UserControl est utilisé, dire deux fois sur la page, puis en plaçant un ScriptManager ne fonctionnera pas parce que vous ne pouvez initialiser ScriptManager une fois.
Dans d'autres UserControls où j'avais besoin d'ScriptManager (j'ai été en utilisant AJAX Toolkit Extensions), j'ai été en mesure d'utiliser ce code:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
Page.Init += new EventHandler(Page_Init);
}
void Page_Init(object sender, EventArgs e)
{
if (Page.Form != null && ScriptManager.GetCurrent(Page) == null)
Page.Form.Controls.AddAt(0, new ScriptManager());
}
..très travaillé, mais pas pour l'UpdatePanel cas.
Remarque, je ne suis PAS à l'aide de Pages Maîtres
(Une autre approche que je pensais, mais ne peut pas comprendre comment le faire, est de créer par programme le UserControl à l'intérieur d'un UpdatePanel.)
- Juste un côté pas, le code est un peu "double". Vous substituez la méthode OnInit et ajouter une Init de Gestionnaire d'Événements. Il suffit de placer le code dans Page_Init dans le substituée OnInit?
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas que ce soit possible. J'ai essayé de plusieurs façons différentes. Vous pourriez mordre la balle et de mettre un scriptmanager dans votre page.
Ce qui est la raison pour laquelle cela ne fonctionne pas? Êtes-vous d'obtenir une exception à la règle de l'UpdatePanel un ScriptManager est nécessaire? Êtes-vous en utilisant le Système.Web.Extensions 1.0 ou 3.5? Je dis cela parce qu'une modification a été apportée à l'UpdatePanel en 3.5 qui provoque son contenu modèle pour instancier avant OnInit, donc je ne vois pas une raison évidente pourquoi cela ne fonctionnerait pas. Si il y a une exception, il serait utile de voir la trace de la pile.
Je suis frapper ce même problème. Le problème est que vous devez ajouter le scriptmanager avant le OnInit stade - aussi loin que je peux voir, il doit être fait à la preinit scène. Vous pouvez voir cela en ajoutant une charge de remplace - j'ai trouvé la page obtenu grâce à l'preinit ok, puis est allé à la addedcontrol et il était à (ou juste après, mais ce point de sens) que le "Vous avez besoin d'un scriptmanager" est lancée. J'ai du mal à trouver comment ajouter un gestionnaire d'événements à la Page.PreInit cas d'un enfant de usercontrol comme le WUCs n'avez pas de PreInit événement. Même la CMU constructeur n'a pas le feu avant de ce point, et dans le constructeur de l'objet page est nulle de sorte que vous ne pouvez pas ajouter de là. Même à la AddedControl stade de la CMU, vous ne semblez pas être en mesure d'accéder à la page principale ( ScriptManager oSCM = ScriptManager.GetCurrent(Page); retourne la valeur null) si vous n'arrivez pas à ajouter le scriptmanager, si vous en avez besoin, avant que l'erreur est levée.
/modifier:-
Aussi loin que je puisse le voir (et je n'ai eu aucune réponse à ce sur le asp.net forums - surprise, surprise) la CMU n'est pas le début de coups de pied dans les méthodes et les événements jusqu'à ce que après le parent preinit stade, il y a donc 2 façons de le faire.
1) La façon dont je pense que je ferais c'est de ne pas mettre n'importe quel contenu dans le concepteur, qui exige que le scriptmanager et de mettre des espaces réservés où un tel contenu doit aller. Puis, dans la cmu de charger vous utilisez le ScriptManager.GetCurrent pour voir si il y a un déjà là et puis créer si elle n'est pas. Puis vous ajouter dynamiquement le contenu qui nécessite la SCM. Quelque chose comme ceci:-
puis l'utiliser ainsi:-
Donc, si vous avez des commentaires ou décommentez la SCM dans la page parent, la CMU fonctionne toujours de toute façon.
2) j'ai vu une autre option où un panneau de mise à jour était nécessaire et que le programmeur a créé toutes les commandes dans la fenêtre de configuration, puis en boucle autour d'eux dans le chargement de la page (après la création de la SCM, si nécessaire, et l'UDP et ajouté tous les contrôles de la CMU UDP, avant d'ajouter à l'espace réservé, mais cela me semble plutôt dangereux comme cela semble être le double de l'instanciation de contrôle, et je pense qu'il peut revenir à mordre sur les fesses...
L'inconvénient avec la méthode 1 est que c'est du travail de tout créer dans votre updatepanel par programme, mais si vous voulez vraiment de construire une auto-dépendante de la CMU, ce qui semble être votre prix (et, espérons-le, la CMU ne devrait pas être si compliqué que ça, de toute façon). Personnellement, je pense que, dans mon application (comme la CMU ne seront pas utilisées en dehors d'elle) je vais juste m'assurer d'ajouter dans une SCM en cas de besoin sur la page principale.
Un autre, en définitive, remarque je poix - j'ai vu des gens qui disent "ajouter à la page maître" - ce qui semble être une particulièrement mauvaise idée, à mon humble avis, à moins que chaque page dans votre application a besoin de la SCM comme il va ajouter un tout nouveau niveau de dilatation de vos pages, et qui ne semble pas être une bonne idée aussi ASP.NET semble avoir un bon niveau de ballonnement déjà...
Au lieu de les ajouter dynamiquement un ScriptManager si aucun n'existe, sur la page, il suffit de faire l'inverse: ajouter un ScriptManager à votre ASCX et de se débarrasser de celui-ci si il y a un déjà sur la page. Alors...
Mise à JOUR:
Nah, après d'autres tests cela ne fonctionne pas, comme ScriptManager1 = null ne fait rien d'utile. Si il y a une manière de le faire (ou de supprimer la Page de contrôle), s'il vous plaît commentaire.
Solution: vous peut ajouter un scriptmanager de façon dynamique dans la usercontrol en vérifiant si la page ne contient pas déjà un ScriptManager. Voici comment faire:)
Dans le contrôle UserControl (ascx) code html de mettre ceci:
Et dans le code-behind (ascx.cs):
Parfois, il est nécessaire de définir un ScriptManager de façon dynamique. Dans mon cas, je suis à l'aide d'un usercontrol qui seront mises en pages différentes, mais certaines de ces pages contiennent déjà un ScriptManager et d'autres pas, alors, comment va mon usercontrol savoir si elle doit définir ses propres ScriptManager? La beauté du code ci-dessus est que le contrôle utilisateur ajoute un scriptmanager seulement si il n'existe pas déjà un sur la page.
Remarque: le Système.Web.L'INTERFACE utilisateur.AjaxScriptManager peut être remplacé par le Système.Web.L'INTERFACE utilisateur.ScriptManager si vous utilisez une ancienne version de l'Ajax.