Frage

Ich entwickle eine WebPart (es wird in einer Sharepoint-Umgebung verwendet werden, obwohl es nicht auf das Objektmodell nicht verwendet), die ich mag in AJAX-Funktionalität verfügbar machen. Aufgrund der Natur der Umgebung, den Skript-Managers Hinzufügen direkt zu die Seite ist keine Option, und so muss das Programm hinzugefügt werden. Ich habe versucht, die Scriptmanager-Steuerelement auf der Seite in meinem webpart Code hinzuzufügen.

protected override void CreateChildControls()
{
    if (ScriptManager.GetCurrent(Page) == null)
    {
        ScriptManager sMgr = new ScriptManager();
        // Ensure the ScriptManager is the first control.
        Page.Form.Controls.AddAt(0, sMgr); 
    }
}

Wenn jedoch dieser Code ausgeführt wird, erhalte ich die folgende Fehlermeldung:

  

"Die Steuer Sammlung kann nicht während DataBind, Init, Last, PreRender oder Unload Phasen geändert werden."

Gibt es eine andere Möglichkeit, das Script auf der Seite von einem WebPart hinzuzufügen, oder werde ich nur noch das Script hinzufügen zu jeder Seite (oder Master-Seite), die die WebPart verwenden?

War es hilfreich?

Lösung

Ich konnte dies durch die Verwendung der Seite der Init-Ereignisses zur Arbeit kommen:

protected override void OnInit(EventArgs e)
{
    Page.Init += delegate(object sender, EventArgs e_Init)
                 {
                     if (ScriptManager.GetCurrent(Page) == null)
                     {
                         ScriptManager sMgr = new ScriptManager();
                         Page.Form.Controls.AddAt(0, sMgr);
                     }
                 };
    base.OnInit(e);
}

Andere Tipps

Ich habe dies getan, und es funktioniert. Erstellen Sie einen Platzhalter für die Kontrollen:

<asp:PlaceHolder ID="WebGridPlaceholder" runat="server" >
</asp:PlaceHolder>

Dann können Sie tun dies in Createchild:

ScriptManager aSM = new ScriptManager();
aSM.ID = "GridScriptManager";
WebGridPlaceholder.Controls.Add(aSM);

Ich lief in dieses Problem mit einer benutzerdefinierten ascx Server Kontrolle. Ich habe versucht, die viele Lösungen Skript an die OnInit Ereignisse des Steuer Zugabe (die erst ausgefuehrt wird, nachdem sie überprüft, für die Scriptsteuerung), Logik hinzufügen, die in dem Server-Tags auf der Steuerung und das Hinzufügen Dinge über jede andere Veranstaltung. Nicht gut. Ich baute schließlich ein Steuerelement, das von Script erbt und verwendet dann ktrauberman des Stück Code, leicht modifiziert, ein Script hinzufügen, wenn erforderlich:

  public class ProxiedScriptManager : ScriptManagerProxy
  {
    protected override void OnInit(EventArgs e)
    {
      //double check for script-manager, if one doesn't exist, 
      //then create one and add it to the page
      if (ScriptManager.GetCurrent(this.Page) == null)
      {
        ScriptManager sManager = new ScriptManager();
        sManager.ID = "sManager_" + DateTime.Now.Ticks;
        Controls.AddAt(0, sManager);
      }

      base.OnInit(e);
    }
  }

Das hat es für mich.

Ich hatte das gleiche Grundproblem der Rest von euch hatte. Ich habe eine benutzerdefinierte ascx Kontrolle zu schaffen und wollte nicht über der Lage sein, sich Sorgen zu machen, ob die rufende Seite hatte die Script erklärt. Ich habe rund um die Themen durch die folgenden auf die ascx contorl Zugabe von selbst.

zur ascx Seite -

<asp:PlaceHolder runat="server" ID="phScriptManager"></asp:PlaceHolder>

in dem Update-Panel selbst - oninit="updatePanel1_Init"

auf die ascx.cs Datei -

protected void updatePanel1_Init(object sender, EventArgs e)
{
     if (ScriptManager.GetCurrent(this.Page) == null)
     {
         ScriptManager sManager = new ScriptManager();
         sManager.ID = "sManager_" + DateTime.Now.Ticks;
         phScriptManager.Controls.AddAt(0, sManager);
     }
}

Vielen Dank an alle anderen in diesem Thread, der hat mich begonnen.

Das ist die einzige Art, wie ich meinen Update-Panel in einem Sharepoint arbeitet 2007/2010 kompatibel webpart bekommen konnte. Wir verwenden eine 2010 Masterseite mit einem Script aber eine 2007 Master-Seite ohne.

.ascx

<asp:PlaceHolder ID="sMgr_place" runat="server" />
<asp:UpdatePanel runat="server" OnInit="updatePanel_Init"><ContentTemplate>
...
</ContentTemplate></asp:UpdatePanel>

.ascx.cs

public void updatePanel_Init(object sender, EventArgs e)
{
    if (ScriptManager.GetCurrent(Page) == null)
    {
        ScriptManager sMgr = new ScriptManager();
        sMgr.EnablePartialRendering = true;
        sMgr_place.Controls.Add(sMgr);
    }
}

Ich habe diesen Code in benutzerdefinierten Web-Kontrollen (CS-), die Update-Panels enthalten.

protected override void OnInit(EventArgs e)
{
    //...
    if (ScriptManager.GetCurrent(this.Page) == null)
    {
        ScriptManager scriptManager = new ScriptManager();
        scriptManager.ID = "scriptManager_" + DateTime.Now.Ticks;
        Controls.AddAt(0, scriptManager);
    }
    //...
}

Ich hatte dieses ähnliches Problem und fand der beste Weg, einen globalen Script auf die Masterpage dann im Code hinzuzufügen war hinter Sie durch hinzufügen:

ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference(virtualPath));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top