2010-10-10 3 views
1

Мне нужна моя MasterPage, чтобы иметь возможность получать ControlIDs элементов управления на ContentPages, но я не могу использовать <% = xxx.CLIENTID%>, поскольку он возвратил бы ошибку, так как элемент управления) может быть не загружена владельцем содержимого.Acess control на ContentPages с помощью Javascript от MasterPage

Некоторые элементы управления имеют так называемые BehaviourID, что это именно то, что мне нужно было, как они могут быть доступны непосредственно с ID: [Asp.net это всегда создает уникальные идентификаторы, таким образом, изменяет идентификатор я вошел] К сожалению, я необходимо получить доступ к

e.g. ASP.NET Control with BehaviouraID="test" 
.... 
document.getElementById("test") 

if I were to use e.g. Label control with ID="asd" 
.... 
document.getElementById('<%= asd.ClientID%>') 

Но если Labelcontrol нет на contentpage, я, конечно, получаю сообщение об ошибке на моем MasterPage. Мне нужно решение на основе javascript. (На стороне сервера)

Thx :-)

ответ

1

Лучшее решение до сих пор:

var HiddenButtonID = '<%= MainContent.FindControl("btnLoadGridview")!=null?  
MainContent.FindControl("btnLoadGridview").ClientID:"" %>'; 
if (HiddenButtonID != "") { 
    var HiddenButton = document.getElementById(HiddenButtonID); 
    HiddenButton.click(); 
} 

Где MainContent является держателем contentplace.

По http://forums.asp.net/members/sansan.aspx

1

Вы можете использовать JQuery и доступ к элементам управления с помощью другого атрибута, кроме идентификатора элемента управления. например

<asp:Label id="Label1" runat="server" bid="test" /> 

$('span[bid=test]') 

Селектор jQuery выберет тег span с помощью bid = "test". (Ярлык отображается как span).

+0

Имейте в виду, что это не XHTML соответствует стандартам. Будет исправлено в HTML5 с пользовательскими атрибутами (data-bid = "test") – RPM1984

0

Вы можете написать json-объект со всеми идентификаторами управления, которые присутствуют на странице контента и «зарегистрировать» этот объект в глобальной области вашей страницы.

Некоторые псевдо псевдо-код, потому что я не могу проверить это на данный момент ...

void Page_Load(object sender,EventArgs e) { 
    System.Text.StringBuilder clientIDs = new System.Text.StringBuilder(); 

    IEnumerator myEnumerator = Controls.GetEnumerator(); 
    while(myEnumerator.MoveNext()) { 
     Control myControl = (Control) myEnumerator.Current; 
     clientIDs.AppendFormat("\t\"{0}\" : \"{1}\",\n", myControl.ID, myControl.ClientID); 
    } 

    page.ClientScript.RegisterStartupScript(page.GetType(), 
              "ClientId", 
              "window.ClientIDs = {" + clientIDs.ToString().Substring(0, clientIDs.ToString().Length - 2) + "};", 
              true); 
} 
0

Похоже, ваш вопрос в том, что вы используете главную страницу для чего-то, что не было предназначено , Главная страница - это элемент управления, как и любой другой элемент управления, и поэтому не может получить доступ к каким-либо элементам управления его родителя (страницы). Более подробная информация:

ASP.Net 2.0 - Master Pages: Tips, Tricks, and Traps

Мое предложение заключается в впрыскивать JavaScript со страницы, где элементы управление на самом деле может быть решено. Вот пример того, как это можно сделать:

#Region " LoadJavaScript " 

     Private Sub LoadJavaScript() 

      Dim sb As New StringBuilder 

      'Build the JavaScript here... 
      sb.AppendFormat(" ctl = getObjectById('{0});", Me.asd.ClientID) 
      sb.AppendLine(" ctl.className = 'MyClass';") 

      'This line adds the javascript to the page including the script tags. 
      Page.ClientScript.RegisterClientScriptBlock(Me.GetType, "MyName", sb.ToString, True) 


      'Alternatively, you can add the code directly to the header, but 
      'you will need to add your own script tags to the StringBuilder before 
      'running this line. This works even if the header is in a Master Page. 
      'Page.Header.Controls.Add(New LiteralControl(sb.ToString)) 

     End Sub 

#End Region 
Смежные вопросы