2009-09-09 63 views
3

我創建了一個啓用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

回答

2

我找到了答案,我的問題。

我在我的JavaScript代碼,用我的啓用Ajax服務器控件如下:

if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded(); 

出於某種原因,這條線也是(自動)由.NET添加如果服務器上的控件的可見性狀態的變化。奇怪的是,.NET只在控件的可見性狀態發生變化時才添加它,而不是每次都添加它。我想刪除我的「if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();」只是讓.NET爲我添加這一行,現在一切正常。

編輯:顯然,當您使用ControlJS模板時,該行會自動添加到控件的JavaScript中。所以,如果你正在創建控件,請小心這個問題。確保你刪除這條線,否則你可能會遇到同樣的問題。

謝謝你的時間!

-Frinny