2010-10-10 35 views
1

上通過Javascript內容網頁,控制我需要我的母版才能夠獲得內容網頁,控件的ControlIDs,但我不能 使用<%= xxx.CLIENTID%>,因爲它會返回一個錯誤的控制(S )可能不會被contentplaceholder加載。接取的母版

某些控件具有所謂的BehaviourID,這正是我所需要的,因爲他們可以通過ID直接訪問: [Asp.net並始終創建唯一的ID,從而改變我輸入的ID] 不幸的是我需要訪問

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,我當然得到我的母版的錯誤。 我需要一個基於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和訪問控制經由另一以外的控制的ID屬性。例如

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

$('span[bid=test]') 

jQuery選擇器將選擇bid =「test」的span標籤。 (標籤呈現爲範圍)。

+0

請記住,這是不符合XHTML。將通過自定義屬性(data-bid =「test」)在HTML5中修復 – RPM1984 2010-10-10 23:45:49

0

您可以編寫一個json對象,其中包含內容頁面上的所有控件ID,並在頁面的全局範圍中「註冊」該對象。

一些僞僞代碼,因爲我不能在此刻測試...

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