通过主页面的Javascript访问内容页面上的控件

时间:2010-10-10 13:32:55

标签: c# javascript asp.net master-pages

我需要我的MasterPage才能在ContentPages上获得ControlID控件,但我不能 使用<%= xxx.CLIENTID%>因为它可能会返回错误,因为控件可能没有被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,我当然会在我的母版页上收到错误。 我需要一个基于javascript的解决方案。 (服务器端)

Thx: - )

4 个答案:

答案 0 :(得分:1)

您可以使用jQuery并通过控件ID以外的其他属性访问控件。 e.g。

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

$('span[bid=test]')

jQuery选择器将选择带有bid =“test”的span标记。 (标签渲染为span)。

答案 1 :(得分:1)

目前为止的最佳解决方案:

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

MainContent是内容持有者。

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

答案 2 :(得分:0)

您可以使用内容页面上存在的所有control-id编写一个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);
}

答案 3 :(得分: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