Контроль доступа на ContentPages через Javascript от MasterPage - PullRequest
1 голос
/ 10 октября 2010

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

Некоторые элементы управления имеют так называемый BehaviourID, который как раз то, что мне нужно, поскольку к ним можно напрямую обращаться с помощью идентификатора: [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 отсутствует на странице содержимого, я, конечно, получаю сообщение об ошибке на своей главной странице.Мне нужно решение, основанное на JavaScript.(на стороне сервера)

Thx: -)

Ответы [ 4 ]

1 голос
/ 11 октября 2010

Лучшее решение на данный момент:

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

Где MainContent является держателем содержимого.

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

1 голос
/ 10 октября 2010

Вы можете использовать jQuery и получить доступ к элементам управления через другой атрибут, отличный от идентификатора элемента управления.Например,

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

$('span[bid=test]')

Селектор jQuery выберет тег span со ставкой = "test".(Метка отображается как span).

0 голосов
/ 11 октября 2010

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

ASP.Net 2.0 - Главные страницы: советы, хитрости и ловушки

Я предлагаю добавить 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
0 голосов
/ 10 октября 2010

Вы можете написать 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);
}
...