Элемент управления, производный от ASP.NET, отображать сценарий только на первом экземпляре страницы

В моем веб-приложении ASP.NET 4.0 у меня есть класс, производный от стандартного ASP.NET <asp:TextBox>. Этот класс должен добавить скрипт на стороне клиента, но скрипт нужно добавить на страницу только один раз, даже если на странице есть несколько экземпляров элемента управления.

Поскольку я не могу получить доступ к ViewState страницы, лучше всего убедиться, что только первый элемент управления отображает скрипт на странице.

Я не могу использовать статическую переменную, так как мне, очевидно, нужно, чтобы она была на странице... а не на сеансе/приложении.

Примерно это то, что у меня есть на данный момент...

Public Class MyTextBox
  Inherits TextBox

  Private Sub MyTextBox_PreRender(sender As Object, e As System.EventArgs) Handles Me.PreRender
    Dim script As String = "window.alert('Hello World');"
    Page.ClientScript.RegisterStartupScript(Me.GetType(), "myscript", script, True)
  End Sub
End Class

Просто для ясности: это не проблема обратной передачи, а только рендеринг сценария в первом экземпляре элемента управления на странице (будь то на самой странице или из пользовательского элемента управления).


person freefaller    schedule 25.11.2013    source источник
comment
@Satpal, это не имеет ничего общего с обратной передачей, это наличие нескольких экземпляров производного элемента управления на одной странице и обеспечение того, чтобы только первый элемент управления отображал сценарий   -  person freefaller    schedule 25.11.2013
comment
Вы проверяли, действительно ли скрипт добавляется несколько раз, если на странице несколько экземпляров элемента управления? Документация (msdn.microsoft.com/en- us/library/z9h4dk8y(v=vs.110).aspx) указывает, что в зависимости от ключа и типа обнаруживаются дубликаты, и сценарий должен отображаться только один раз.   -  person Markus    schedule 25.11.2013
comment
Спасибо за то, что заставил меня выглядеть глупо, @Markus... хотя, если честно, я сделал это сам ;-) Вы совершенно правы, и я не пробовал, я просто предполагал, что это будет отображаться каждый раз!!   -  person freefaller    schedule 25.11.2013
comment
дело было не в том, чтобы кого-то выставить глупым :-) иногда четыре глаза видят больше, чем два.   -  person Markus    schedule 25.11.2013


Ответы (1)


Вы можете использовать ClientScript.IsStartupScriptRegistered, чтобы проверить, зарегистрирован ли он уже:

Public Class MyTextBox
    Inherits TextBox

    Private Sub MyTextBox_PreRender(sender As Object, e As System.EventArgs) Handles Me.PreRender
        If Not Page.ClientScript.IsStartupScriptRegistered("AlertHelloWorld") Then
            Dim alertHelloWorld = "window.alert('Hello World');"
            Page.ClientScript.RegisterStartupScript(GetType(MyTextBox), "AlertHelloWorld", alertHelloWorld, True)
        End If
    End Sub

End Class
person Tim Schmelter    schedule 25.11.2013
comment
Спасибо, Тим ... @Markus (в своем комментарии) указал, что ASP.NET в любом случае отображает только один экземпляр именованного клиентского скрипта. Но ваше решение также устранило необходимость каждый раз создавать скрипт, так что это определенно правильный путь. Еще раз спасибо - person freefaller; 25.11.2013