2012-03-31 3 views
0

Я зациклился на генерации этого динамического управляющего ID, если я поместил свои элементы управления (например, Button) в ContentPage (который наследуется MasterPage) внутри <asp:Content></asp:Content>, когда страница отображается в браузере, тогда контроль Id меняются, я прочитал ScottGu article on 'clientIDMode', и я думал, что моя проблема закончена поэтому я «ClientIDMode» внутри «» Web.ConfigГенерация динамического кода управления ContentPage

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

Но проблема сохраняется, я не могу ссылаться мои элементы управления из кода позади, как это ,

 //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) я не могу использовать только идентификатор управления, который я, указанных в разметке (как если у меня нет MasterPage)?

PS: На AsyncPostback я хочу, чтобы выполнить определенные операции на основе определенной кнопки, которые сделаны AsyncPostback, чтобы сделать, что я должен проверить значение из AsyncPostBackSourceElementID, который, к сожалению, возвращает модифицированный ControlID

+1

В чем проблема с разрешением ASP.NET на именование? Вы все равно можете ссылаться на элемент управления с помощью указанного вами идентификатора, то есть «Label1». –

+0

@JamesJohnson Но я не могу назвать Button1 оригинальным именем ..! –

+1

Я думаю, что вы можете не понимать цель «ClientIDMode =« Статический ». Идентификаторы, которые генерируются ASP.NET, применяются только к стороне клиента. В кодовом коде вы можете обратиться к элементу управления с помощью идентификатора, присвоенного ему в разметке. Если этого не происходит, возникает другая проблема. –

ответ

1

ClientIDMode не имеет значения, потому что AsyncPostBackSourceElementID фактически возвращает имя кнопки, а не идентификатор. Тем не менее, вы можете легко получить имя кнопки через UniqueID собственности:

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

Я думаю, вы непонимание цели ClientIDMode. Идентификаторы, которые генерируются ASP.NET, применяются на стороне клиента, а в кодовом коде вы можете получить доступ к элементам управления по идентификаторам, назначенным им в разметке.

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

Когда это оказывается, уникальный идентификатор (ClientID) будет генерироваться для каждого элемента управления, используя комбинацию идентификатора вы назначили и идентификаторы любого восходящих имен контейнеров. В этом случае Panel1 является контейнером именования, поэтому сгенерированный идентификатор будет:

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

Однако в коде-за вы можете получить доступ к контролю, вы присвоенный ему оригинальный ID:

var labelText = Label1.Text; 

Сгенерированный идентификатор запускается только на стороне клиента, где, например, вам может потребоваться доступ к элементу управления из JavaScript; вы могли бы затем ClientID найти его.

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

Спасибо за ответ, но это не я прошу, я обновил свой вопрос для уточнения. –

+0

Button1.ClientID возвращает «Button1» и AsyncPostBackSourceElementID возвращает ctl00 $ Cntnt $ Button1, это не работает:/ –

+0

Это потому, что у вас 'ClientIDMode' установлен на' Static'. Похоже, что он возвращает имя кнопки, доступ к которой вы можете получить, используя свойство UniqueID для элемента управления. –