2010-11-20 8 views
7

Dies ist ein Problem, mit dem ich in einer Webanwendung konfrontiert bin, an der ich gerade arbeite.
Also anstatt die Frage mit nicht verwandten Code zu plumpsen, habe ich das Problem in einer isolierten, vereinfachten Webanwendung neu erstellt, die nur dieses Problem demonstriert.
Hoffentlich hilft dies bei der Suche nach einer Lösung.Wie wird der Skriptblock bei einem teilweisen Postback beibehalten?

Ich habe eine Web-Benutzersteuerung mit dieser ebenso wie sein Inhalt:

<% if (ShowAlertScript) 
    { %> 
     <script type="text/javascript"> 
      function AlertMe() 
      { 
       alert('Hello World!'); 
      } 
     </script> 
<% } %> 
<input type="button" onclick="AlertMe()" value="Say Hello" /> 

Und seine Code-Behind hat nichts anderes als die boolean Definition von ShowAlertScript.
Dies stellt eine Steuerung, die ich in der großen Webapp haben, die zwei Modi hat: Eingabemodus und Anzeigemodus. Wenn in Eingabemodus, hat es einen großen JavaScript-Block, der nur dann nützlich ist; es tut ein paar coole Sachen, um dem Benutzer zu helfen, die Informationen einzugeben.

Die Art und Weise diese Steuerung ist in dem großen Bild wie folgt angelegt:

<asp:ScriptManager runat="server" /> 
<asp:UpdatePanel runat="server"> 
    <ContentTemplate> 
    <asp:MultiView ActiveViewIndex="0" runat="server" ID="mvw"> 
     <asp:View runat="server"> 
     <asp:Button runat="server" ID="btnSwitch" 
      OnClick="btnSwitch_Click" Text="Switch" /> 
     </asp:View> 
     <asp:View runat="server"> 
     <uc:MyInputControl runat="server" ID="micInput" ShowAlertScript="true" /> 
     </asp:View> 
    </asp:MultiView> 
    </ContentTemplate> 
</asp:UpdatePanel> 

Wenn Sie btnSwitch klicken, es einfach mit der Benutzersteuerung auf den zweiten Blick schaltet. Beachten Sie, wie ich die ShowAlertScript bereits auf true initialisiert habe.
Die potenzielle Ausgabe ist, dass, da ich "das Alert-Skript" innerhalb des Benutzersteuerelements "zeige, wird die AlertMe() Funktion ausgeführt, wenn Sie auf das Element input-button klicken, da es gemäß der Inline-Anweisung if ausgeschrieben ist.

Wenn Sie diesen Code ausführen, habe ich Ihnen so weit wie es ist, wird es nicht funktionieren.
Der Browser wird sagen, es kann die AlertMe() Funktion nicht sehen; Soweit es weiß, ist es undefiniert. Aber wenn Sie die UpdatePanel (oder deaktivieren Sie die ScriptManager 's partielles Rendering), es funktioniert gut für eine vollständige Postback, wenn Sie auf btnSwitch klicken.

Ich möchte, dass es an einem teilweisen Postback funktioniert, weil dieses ganze Ding ein kleines Stück im Vergleich zum Rest der Seite ist, und ich nicht ein komplettes Postback jedes Mal machen will, wenn sie Ansichten wechseln.
Anscheinend versucht die ScriptManager nicht einmal die Ascx-Datei für mögliche Änderungen neu zu rendern.
Entweder ist die ScriptManager nicht intelligent genug, oder es gibt eine Option, die ich vermisse, um es <script> zu rendern, damit ich seine Methoden auf der Clientseite aufrufen kann.

Eine mögliche Antwort, die jemand vorschlagen könnte, ist: "Warum nimmst du das Javascript nicht, legst es in seine eigene .js-Datei und lässt die Seite darauf verweisen, damit es dem Steuerelement zur Verfügung steht?"
Das wird nicht wirklich mit mir arbeiten, weil der Skriptblock einige Initialisierung und Änderung betrifft, die zu dieser einzelnen Kontrollinstanz gehören, nicht zu allen anderen auf der Seite.

Im Gegenzug könnten Sie auch besorgt sein, dass ich, wenn ich mehr als eine Instanz des Steuerelements habe, am Ende Kopien desselben Skripts erhalte. Nicht wirklich; Es wird nur ein Eingabemodus dieses Steuerelements in einer Seite zu einem bestimmten Zeitpunkt sein, es ist nur, dass ich diese beiden Modi in zwei verschiedenen Ansichten habe und ich lasse den Benutzer zwischen ihnen wechseln.

Vielen Dank für das Lesen dieses weit =)
Schätzen Sie jede Hilfe und Eingabe.

Antwort

7

Für Ihren Skriptblock richtig partial page rendering zu unterstützen, müssen Sie es während der PreRender Phase Ihrer Benutzersteuerung registrieren, mit der ScriptManager.RegisterClientScriptBlock() Methode:

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    if (ShowAlertScript) { 
     ScriptManager.RegisterClientScriptBlock(this, 
      typeof(YourUserControl), "AlertScript", 
      @"function AlertMe() 
       { 
        alert('Hello World!'); 
       }", 
      true); 
    } 
} 

(Die oben vorausgesetzt, dass Sie haben das AutoEventWireup Attribut auf true in der @ Control Richtlinie Ihrer ascx-Datei.)

da auch das Skript von einem Steuer Benutzer registriert ist, aber Ihr ScriptManager befindet sich auf der Seite selbst, werden Sie proba Bly muss ein <asp:ScriptManagerProxy> Element zu Ihrem Steuerelement Markup für die oben genannten zu arbeiten.

+0

Hamidi ist richtig .. Dies ist der beste Weg, ich denke .. – Mohit

+0

, die perfekt gearbeitet; Vielen Dank! – BeemerGuy

+0

rettete mir den Tag <3 – adripanico

1

UpdatePanels haben tatsächlich ihren Inhalt von der AJAX-Framework-Einstellung innerHTML auf dem div entsprechend dem UpdatePanel-Steuerelement geändert.

Script-Elemente werden nicht ausgeführt, wenn innerHTML- gesetzt.

Daher gibt es keine Möglichkeit, inline (d. H. Deklarativ) JS während eines partiellen Postback ausgeführt werden.

Verwandte Themen