2009-12-16 4 views
0

Je suis actuellement en train de configurer des fonctionnalités AJAX dans un environnement SharePoint pour prendre en charge les parties Web que je crée avec C#. J'utilise la procédure pas à pas de Microsoft comme point de départ juste pour démarrer et je cours dans ce que je crois être une erreur étrange. Le problème se produit dans CreateChildControls():Implémentation de SharePoint AJAX: ScriptHandler ajouté deux fois

protected override void CreateChildControls() 
    { 

     base.CreateChildControls(); 

     //Fix for the UpdatePanel postback behaviour. 
     EnsurePanelFix(); 

     LinkButton sayHello = new LinkButton(); 
     UpdatePanel refreshName = new UpdatePanel(); 
     ScriptManager scriptHandler = new ScriptManager(); 
     displayName = new Label(); 
     inputName = new TextBox(); 

     //Set up control properties. 
     this.displayName.ID = "displayName"; 
     this.displayName.Text = "Hello!"; 
     this.inputName.ID = "inputName"; 
     sayHello.ID = "sayHello"; 
     sayHello.Text = "Say Hello"; 
     scriptHandler.ID = "scriptHandler"; 
     refreshName.ID = "refreshName"; 
     refreshName.UpdateMode = UpdatePanelUpdateMode.Conditional; 
     refreshName.ChildrenAsTriggers = true; 

     //Add the EventHandler to the Button. 
     sayHello.Click += new EventHandler(ClickHandler); 

     //Add the user interface (UI) controls to the UpdatePanel. 
     refreshName.ContentTemplateContainer.Controls.Add(this.inputName); 
     refreshName.ContentTemplateContainer.Controls.Add(sayHello); 
     refreshName.ContentTemplateContainer.Controls.Add(this.displayName); 

     //The ScriptManager control must be added first. 
     this.Controls.Add(scriptHandler); 
     this.Controls.Add(refreshName); 
    } 

Le problème que j'ai est que, pour une raison quelconque, CreateChildControls() doit être appelé deux fois. Quand je parcours le code, il exécute chaque ligne avec un problème, puis revient à la première ligne et répète. Quand il arrive à l'avant-dernière ligne où il ajoute le ScriptManager, il lance bien sûr une exception, car il essaie d'ajouter un second ScriptManager à la page avec une clé identique. Peut-être que c'est une erreur dans ma compréhension de la façon dont cette méthode devrait fonctionner, mais je ne comprends pas pourquoi elle est appelée deux fois (ou de manière récursive infiniment, pour autant que je sache, si cette exception n'a pas été lancée). Merci pour toute aide que quelqu'un peut me donner.

Répondre

1

Vous pouvez ajouter un indicateur privé au niveau de la classe - Vérifiez-le après votre base.CréezChildControls() et ignorez le reste de la fonction si elle est définie, puis définissez-la lorsque le scriptHandler est ajouté, surveillez le débogage pour vous assurer Ce n'est pas une boucle infinie.

Vérifiez également la pile des appels - CreateChildControls() peut être appelée à partir d'endroits différents. Et, en aparté, avez-vous essayé Microsoft SharePoint Designer - J'ai commencé à développer des contrôles Web pour SharePoint dans VS 2005 avec Ajax, mais j'ai ensuite découvert que je pouvais faire la plupart des choses en utilisant SharePoint Designer à la place.

+0

J'ai essayé SharePoint Designer, et je le fais comme ça. Malheureusement, pour cette partie Web en particulier, le faire dans VS sera plus rapide, à condition que cette fonctionnalité AJAX soit opérationnelle et fonctionne rapidement. Je vais essayer cela et voir ce qui se passe! –

+0

Ça l'a fait! Merci de votre aide! Je repérerai d'où vient l'appel plus tard, mais pour l'instant, tout va bien. –

0

Assurez-vous que vous n'appelez pas CreateChildControls dans votre code. Utilisez EnsureChildControls à la place.

4

Je sais que cela déjà marqué comme ayant été, mais c'est le code qui insère le ScriptManager si l'on ne se trouve pas dans la page:


public abstract class WebPartBase : WebPart 
{ 
    protected override void OnInit(EventArgs e) 
    { 
     if (ScriptManager.GetCurrent(Page) == null) 
     { 
      ScriptManager scriptManager = new ScriptManager(); 
      scriptManager.ID = "ScriptManager1"; 
      scriptManager.EnablePartialRendering = true; 
      Page.Form.Controls.AddAt(0, scriptManager); 
     } 
     base.OnInit(e); 
    } 
}

tous les webparts héritent de cette classe de base. Tout le code a été supprimé pour plus de clarté, cela ne concerne que le gestionnaire de script, mais vous pouvez gérer les erreurs de partie Web et d'autres problèmes.