2012-09-14 42 views
1

我知道這似乎不切實際,但我真的更喜歡這樣做,因爲我正在重新構建此WebForms頁面以滿足緊急的最新業務需求。ASP.NET WebForms:在通過UpdatePanel使其可見後,如何訪問不可見,非呈現的Javascript?

我有一個自定義的用戶控件。在這個用戶控件中是一個Javascript塊,它包含連接到各種控件'onclickonchange事件的函數。之前,該控件的.Visible屬性爲True,因此其HTML和Javascript會在頁面上呈現。

現在我需要將我的控件的.Visible屬性設置爲false並在其周圍包裝UpdatePanel。這樣做可以防止在初始頁面加載期間呈現控件的HTML。要顯示該控件的內容,用戶必須單擊一個按鈕,該按鈕將按照服務器端方法將控件的.Visible屬性設置爲true。由於它現在在UpdatePanel中,控件以Ajaxy的方式出現在頁面上。但是,似乎位於控件中的Javascript無法訪問,因此沒有任何子控件的onclickonchange事件正在工作,因爲它們的相關Javascript函數是undefined

的解決方案,我不喜歡使用的過於複雜的進入爲簡潔起見原因:

  • JSON/AJAX(參與這樣短的時間太多rearchitecture)
  • CSS顯示:none/visibility:visible(我需要保留儘可能多的serverside功能,以儘量減少重新架構)
  • 將Javascript放在父頁面或.js文件中(我會認爲這是最後一招,但我參考服務器控制使用<#%=ControlId.ClientID %>。如果Javascript未包含在UserCo中,則不能執行此操作ntrol我不想設置控件ClientIdModestatic

我真的想找到一種方法來保持的Javascript語言,我的用戶以這樣一種方式,它是在客戶端訪問當UpdatePanel通過使用UpdatePanel將控件的.Visible屬性設置爲true時。

+0

你有沒有想出一個解決這個?我現在正在遇到一模一樣的問題 –

回答

2

這樣做將是包括JavaScript作爲後面的代碼中一個大的字符串,並將其註冊負載最簡單的方法:

 protected void Page_Load(object sender, EventArgs e) 
     { 
      string javasriptToRegister = @" 
    function MyAwesomeJavaScriptFunction() { 
    alert(document.getElementById('" + this.txtCatName.ClientID + @"').value); 
    }"; 
      ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "MyControlsJavaScript", javasriptToRegister, true); 
     } 

這絕不是把它做最徹底的方法,但它會起作用。

如果你想做得更乾淨一點,你可能想要包含一個外部JavaScript文件,其中包含代表控件的單例或原型對象(取決於你的用例)。然後,您可以使用較小的腳本將對象/單例的屬性設置爲您的客戶端ID,如上所述。例如:

的Javascript:

function MyControlScriptModel() { 
    this.txtCatNameClientId = ''; 
    this.othercontainedValue = 0; 
    this.anothercontainedValue = 0; 
} 

MyControlScriptModel.prototype.DoSomethingWithCatName = function() { 
    alert(document.getElementById(this.txtCatNameClientId).value); 
} 

後面的代碼:

 protected void Page_Load(object sender, EventArgs e) 
     { 
      string javasriptToRegister = string.Format(@"var obj = new MyControlScriptModel(); 
                 obj.txtCatNameClientId = '{0}';", this.txtCatNameClientId); 
      ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "MyControlsJavaScript", javasriptToRegister, true); 
     } 
相關問題