2012-03-31 12 views
0

Ich bin mit dieser dynamischen Steuerelement-ID-Generation fest, wenn ich meine Steuerelemente (sagen Button) in ContentPage (die von MasterPage geerbt wird) innerhalb <asp:Content></asp:Content> wenn die Seite im Browser dann gerendert wird STEUER-ID geändert werden, las ich ScottGu article on 'clientIDMode' und ich dachte, mein Problem ist vorbei, damit ich innen ‚Web.Config‘ ‚ClientIDMode‘ gesetztDynamische Steuerelement-ID-Generierung von ContentPage

<pages clientIDMode="Static"></pages> 

Aber das Problem weiterhin besteht kann ich meine Kontrollen von Code hinter wie diese nicht beziehen ,

 //ctl00$Cntnt$Button1 name works but its dynamically created 
     if (ScriptManager1.AsyncPostBackSourceElementID == "Button1") 
     { 
      Label1.Text = "Async PostBack occured @ " + DateTime.Now.ToLongTimeString(); 
     } 

ASP.net Markup:

<asp:Button ID="Button1" runat="server" Text="Refresh me" onclick="Button1_Click" /> 

Browser Side Markup:

<input type="submit" name="ctl00$Cntnt$Button1" value="Refresh me" id="Button1" /> 

Q) Kann ich nicht nur die Id der Kontrollen verwenden, die ich in der Markup angegeben haben (wie wenn ich keine MasterPage habe)?

PS: Auf AsyncPostback möchte ich auf der Grundlage spezifischer Knopf bestimmte Operationen auszuführen, die AsyncPostback gemacht, zu tun, dass ich Wert von AsyncPostBackSourceElementID zu überprüfen, die leider geändert kehrt ControlID

+1

Was ist das Problem mit ASP.NET die Benennung zu behandeln? Sie können das Steuerelement weiterhin anhand der von Ihnen angegebenen ID referenzieren, z. B. "Label1". –

+0

@JamesJohnson Aber ich kann Button1 nicht durch seinen ursprünglichen Namen beziehen ..! –

+1

Ich denke, Sie könnten den Zweck von 'ClientIDMode =" Static "' falsch verstehen. Die von ASP.NET generierten IDs gelten nur für die Clientseite. Im Code-Behind können Sie auf das Steuerelement anhand der ID verweisen, die Sie ihm im Markup zugewiesen haben. Wenn dies nicht geschieht, haben Sie ein anderes Problem. –

Antwort

1

Die ClientIDMode keine Rolle spielt, weil AsyncPostBackSourceElementID gibt tatsächlich den Namen der Schaltfläche statt der ID zurück. Sie können jedoch leicht den Namen der Taste durch die UniqueID Eigentum:

if (ScriptManager1.AsyncPostBackSourceElementID == Button1.UniqueID) 
{ 
    //do whatever 
} 

Ich denke, Sie zum Zwecke der ClientIDMode Missverständnis. Die von ASP.NET generierten IDs werden auf die Clientseite angewendet, und im Code-Behind können Sie weiterhin auf Steuerelemente anhand der IDs zugreifen, die ihnen in Markup zugewiesen wurden.

<asp:Panel ID="Panel1" runat="server"> 
    <asp:Label ID="Label1" runat="server" /> 
</asp:Panel> 

Wenn dies gemacht wird, eine eindeutige Kennung (ClientID) wird für jede Steuerung erzeugt werden, um eine Kombination aus der ID unter Verwendung Sie zugeordnet und die IDs aller ascendant Benennungs Container. In diesem Fall Panel1 ist der Namenscontainer, so würde die erzeugte ID sein:

<span id="ctl00_Panel1_Label1"></span> 

jedoch in der Code-Behind Sie immer noch die Kontrolle durch die ursprüngliche ID zugreifen können Sie es zugewiesen:

var labelText = Label1.Text; 

Die generierte ID kommt nur auf der Client-Seite ins Spiel, wo Sie z. B. von JavaScript auf das Steuerelement zugreifen müssen; Sie könnten dann die ClientID finden.

var labelText = document.getElementById("<%=Label1.ClientID%>").innerText; 
+0

Danke für die Antwort, aber das ist nicht gefragt, ich habe meine Frage zur Klarstellung aktualisiert. –

+0

Button1.ClientID gibt "Button1" zurück und AsyncPostBackSourceElementID gibt ctl00 $ Cntnt $ Button1 zurück, dies funktioniert nicht:/ –

+0

Das liegt daran, dass Sie 'ClientIDMode' auf' Static' gesetzt haben. Es sieht so aus, als ob es den Namen der Schaltfläche zurückgibt, auf die Sie mit der Eigenschaft 'UniqueID' des Steuerelements zugreifen können. –