我創建了一個啓用Ajax的.NET服務器控件。該控件繼承Panel並實現IScriptControl(爲了啓用控件的Ajax組件)。支持Ajax的.NET服務器控件註冊
其實很簡單。它本質上是一個風格爲溢出的面板:滾動(它是一個「可滾動面板」),它記住它在服務器異步回傳之間的滾動位置,以便在異步回發時滾動位置不會重置爲0,0回報。
一切都已經工作了一段時間現在(幾年),但我從來沒有試圖使這種控制隱形(服務器端)。即使我將此控件的父級設置爲Visible = false,此控件也無法正常工作。
我得到通過在Web瀏覽器中Ajax.NET框架拋出的異常:
錯誤:Sys.ScriptLoadFailedException:腳本 「http://UrlToAScript」 包含Sys.Application.notifyScriptLoaded多次調用() 。只有一個是允許的。
它與Render事件沒有被觸發有關(因爲控件不可見,所以沒有渲染,因此Render事件實際上沒有發生)。當控件變得可見(並且渲染事件發生時),我在Web瀏覽器(客戶端)中看到異常,聲明它已多次註冊。 (希望我所說到的理解是,ScriptDescriptors在阿賈克斯的渲染事件使用ScriptManager註冊啓用服務器控件的觀衆)
這裏是我的實現,它處理的OnPreRender和渲染事件:
Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
Me.Style.Add("overflow", "scroll")
If Not Me.DesignMode Then
If ScriptManager Is Nothing Then
Throw New HttpException("A ScriptManager control must exist on the page.")
End If
ScriptManager.RegisterScriptControl(Me)
End If
MyBase.OnPreRender(e)
End Sub
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
'Register the ScrollContiner's script descriptors that are created by the GetScriptDescriptors method
If Not Me.DesignMode Then
ScriptManager.RegisterScriptDescriptors(Me)
End If
MyBase.Render(writer)
End Sub
Public Function GetScriptReferences() As System.Collections.Generic.IEnumerable(Of System.Web.UI.ScriptReference) Implements System.Web.UI.IScriptControl.GetScriptReferences
Dim reference As ScriptReference = New ScriptReference()
reference.Name = "MyNamespace.ScrollContainer.js"
reference.Assembly = "MyNamespace"
Return New ScriptReference() {reference}
End Function
Public Function GetScriptDescriptors() As System.Collections.Generic.IEnumerable(Of System.Web.UI.ScriptDescriptor) Implements System.Web.UI.IScriptControl.GetScriptDescriptors
Dim descriptor As ScriptControlDescriptor = New ScriptControlDescriptor("MyNamespace.ScrollContainer", Me.ClientID)
descriptor.AddProperty("LeftScrollPosition", Me.LeftScrollPosition)
descriptor.AddProperty("RightScrollPosition", Me.RightScrollPosition)
descriptor.AddProperty("ScrollPositionMessengerName", Me.ScrollPositionMessengerName)
Return New ScriptDescriptor() {descriptor}
End Function
我不知道如何解決這個問題。 任何有識之士將不勝感激。
非常感謝,
-Frinny