Контрол, извлечен от 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, това няма нищо общо с post-back, това е наличието на множество екземпляри на извлечената контрола на една и съща страница и гарантиране, че само първата контрола изобразява скрипта   -  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