UserControl mit UpdatePanel programmgesteuert erstellen ScriptManager möglich?
Ich möchte in einem UpdatePanel in meinem UserControl. Das problem ist die .aspx-Seite das Steuerelement abgelegt wird, wird NICHT ein ScriptManager. Ich müssen Sie das ScriptManager-Steuerelement in das Benutzersteuerelement. Allerdings, wenn das Benutzersteuerelement verwendet, zweimal sagen: auf der Seite, dann platzieren Sie einen ScriptManager wird nicht funktionieren, da Sie nur initialisieren ScriptManager einmal.
In andere Benutzersteuerelemente, wo ich gebraucht ScriptManager (ich war mit AJAX-Toolkit-Erweiterungen) ich war in der Lage, diesen code verwenden:
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());
}
..hat Super funktioniert, aber nicht für das UpdatePanel Fall.
Beachten Sie, ich bin NICHT mithilfe von Master-Seiten
(Ein anderer Ansatz, den ich dachte, aber kann nicht herausfinden, wie zu tun, ist programmgesteuert erstellen Sie das Benutzersteuerelement in einem UpdatePanel.)
- Nur eine Seite nicht, der code ist etwas "doppelt". Überschreiben Sie die OnInit-Methode, und fügen Sie ein Init-Ereignishandler. Legen Sie einfach den code in Page_Init in der OnInit überschrieben?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass dies möglich ist. Ich habe versucht mehrere verschiedene Möglichkeiten. Haben Sie vielleicht beißen Sie die Kugel und setzen Sie einen scriptmanager auf der Seite.
Was ist der Grund, warum es nicht funktioniert? Sind Sie immer eine Ausnahme von der UpdatePanel, die ein ScriptManager-Steuerelement ist erforderlich? Sind Sie mit System.Web.Extensions 1.0 oder 3.5? Ich sage das, weil eine änderung wurde vorgenommen, um UpdatePanel-in 3.5, die bewirkt, dass seine content-template zu instanziieren vor OnInit, also ich sehe keinen offensichtlichen Grund, warum das nicht funktionieren würde. Wenn es eine Ausnahme wäre es hilfreich zu sehen, der stack-trace.
Ich bin zu schlagen, das gleiche problem. Das problem ist, dass müssen Sie das scriptmanager-Steuerelement, bevor die OnInit-Bühne, die - soweit ich es sehen kann, getan werden muss, um in die preinit Phase. Sie können dies durch das hinzufügen einer Last von irregulären ich fand das die Seite bekam durch die preinit ok, dann ging der addedcontrol Veranstaltung und es wurde bei (oder kurz nach, aber dieser Punkt macht Sinn), die "benötigen Sie einen scriptmanager" wird geworfen. Ich bin kämpfen, um herauszufinden, wie das hinzufügen eines event-handler für die Seite.PreInit-Ereignis von einem Kind, das Benutzersteuerelement als der WUCs nicht über eine PreInit-Ereignis. Auch die WUC-Konstruktor nicht ausgelöst, bevor dieser Punkt und im Konstruktor der page-Objekt null ist, so können Sie nicht fügen Sie es dort. Auch bei der AddedControl Bühne des WUC, Sie immer noch nicht scheinen, um in der Lage sein, um Zugriff auf die Hauptseite ( ScriptManager-oSCM = ScriptManager.GetCurrent(Page); gibt null zurück), so dass Sie kann nicht scheinen, um fügen Sie das scriptmanager-Steuerelement, wenn Sie brauchen, um, bevor der Fehler ausgelöst wird.
/edit:-
Soweit ich es sehen kann (und ich habe keine Antwort auf diese auf den asp.net Foren - überraschung, überraschung), das WUC nicht starten kicking in es Methoden/Ereignisse bis nach der Eltern, die preinit Phase, es gibt also 2 Möglichkeiten, dies zu tun.
1) Die Art und Weise ich glaube, ich würde dies tun ist, um Sie nicht alle Inhalte in der designer, erfordert das scriptmanager-Steuerelement und setzen Sie Platzhalter, in denen solche Inhalte gehen muss. Dann in die wuc laden verwenden Sie das ScriptManager-Steuerelement.GetCurrent zu sehen, ob es schon da und dann erstellen Sie es, wenn nicht. Dann sind Sie dynamisch Inhalte hinzufügen erfordert, dass der SCM. So etwas wie dieses:-
dann verwenden Sie es so:-
Also, wenn Sie kommentieren oder die der SCM in der übergeordneten Seite, das WUC noch funktioniert, so oder so.
2) ich habe gesehen, eine weitere option, wo ein update-panel gebraucht wurde und der Programmierer erstellt alle Steuerelemente im designer, und dann schlang um Sie in die Seite laden (nach dem erstellen der SCM, wenn nötig, und die UDP-und alle Steuerelemente auf der WUC UDP, bevor Sie dann hinzufügen, dass, um Platzhalter, aber das scheint mir eher gefährlich, als es den Anschein Doppel-Instanziierung Steuern, und ich denke, es kann wieder kommen, um Sie zu beißen auf den Hintern...
Den Nachteil mit der Methode 1 ist, dass es mehr Arbeit zu schaffen, alles in Ihren updatepanel-programmatisch, aber wenn Sie wirklich wollen, zu bauen, eine eigenverantwortliche WUC zu sein scheint, dass Sie Ihren Preis (und hoffentlich auch das WUC sollte nicht sein, dass kompliziert, sowieso). Ich persönlich glaube, dass in meiner app (wie das WUC nicht verwendet werden, die außerhalb davon) werde ich nur sicherstellen, dass ich in ein SCM-wo notwendig auf der Hauptseite.
Einer anderen, Finale, Hinweis ich würde pitch in - ich habe gesehen, Menschen, die sagen: "fügen Sie die master-Seite" - dies scheint eine besonders schlechte Idee, IMHO, es sei denn jeder Seite in Ihrer app muss der SCM als es fügt eine ganz neue Ebene von aufblasen zu Ihren Seiten, und dass nicht zu sein scheinen eine gute Idee ASP.NET scheint ein gutes Niveau von aufblasen schon...
Anstelle von dynamisch hinzufügen, die ein ScriptManager-wenn keiner vorhanden ist, auf der Seite, einfach das Gegenteil tun: fügen Sie einen ScriptManager auf Ihre ASCX und es loswerden, wenn es einem schon auf der Seite. So...
UPDATE:
Nee, nach weiteren Tests diese arbeiten nicht, wie ScriptManager1 = null gesetzt wird, ist nichts hilfreich. Wenn es einen Weg gibt, dies zu tun (oder zu entfernen Sie die Seite control), bitte kommentieren.
Lösung: Sie kann fügen Sie ein scriptmanager-Steuerelement dynamisch in das Benutzersteuerelement, indem überprüft wird, ob die aktuelle Seite nicht bereits enthalten, die ein ScriptManager. Hier ist, wie:)
In der UserControl (ascx) html setzen diese:
Und in der code-behind (ascx.cs):
Manchmal ist es nötig zu definieren, die ein ScriptManager-dynamisch. In meinem Fall bin ich mit einem usercontrol, die dann in verschiedenen Seiten, aber einige dieser Seiten enthalten bereits ein ScriptManager-Steuerelement und das einige das nicht tun, so wie mein usercontrol wissen, ob es definieren sollte seine eigenen ScriptManager? Die Schönheit der obige code ist, dass das Benutzersteuerelement fügt einen scriptmanager nur, wenn es nicht bereits auf der Seite.
Hinweis: das System.Web.UI.AjaxScriptManager kann ersetzt werden mit System.Web.UI.ScriptManager wenn Sie eine ältere version von Ajax.