2013-12-12 80 views
0

我有一個用戶控件,它需要每個控件的Javascript/jquery。它實際上是一個用圖形表示使用一些JavaScript庫的數據的控件。作爲規範,我的所有javascript鏈接都位於主頁面的頁面底部。這意味着我不能在控件中編寫任何JavaScript,因爲它會出現在它的任何依賴關係之前。另外,即使腳本位於頁面的底部,它也只適用於第一個控件。有沒有人遇到類似的挑戰?我正在尋找出路。謝謝Asp.Net:用戶控件,JavaScript和JavaScript庫

+0

您可能需要添加更多具體細節,否則它看起來有現有的答案。 http://stackoverflow.com/questions/1703601/where-do-i-put-javascript-when-using-an-asp-net-user-control –

回答

1

我有一個類似的問題,「更新」一個有大量內聯JS的遺留站點......所以當我將jQuery和其他腳本移動到頁面底部時,我也遇到了一些問題。我解決它加入了新的ContentPlaceHolder到母版頁,其他腳本引用下面:

<asp:ContentPlaceHolder ID="ScriptsPlace" runat="server"></asp:ContentPlaceHolder> 
</body> 

然後通過網頁去了,感動了所有的內聯JS到內容塊ScriptsPlace

<asp:Content ID="Content5" ContentPlaceHolderID="ScriptsPlace" runat="server"> 
    <script> 
     //some awesome JS 
    </script> 
</asp:Content> 

儘管這不會對用戶控件工作...所以我做了,基本上涉及到把所有的用戶控件JS的成div名爲_jsDiv,然後從後臺代碼移動有點哈克解決方案將div放入佔位符中(我不喜歡RegisterStartupScript,它對於很多代碼都不實用)。

因爲我這樣做在多個控件,我做了這些步驟:

步驟1 - 製作一個自定義用戶控件,ScriptMoverUserControl.cs:

public class ScriptMoverUserControl : System.Web.UI.UserControl 
{ 
    protected void Page_PreRender(object sender, EventArgs e) 
    { 
     ContentPlaceHolder c = Page.Master.FindControl("ScriptsPlace") as ContentPlaceHolder; 
     HtmlGenericControl jsDiv = this.FindControl("_jsDiv") as HtmlGenericControl; 
     if (c != null && jsDiv != null) 
     { 
      jsDiv.ID = Guid.NewGuid().ToString(); //change the ID to avoid ID conflicts if more than one control on page is using this. 
      c.Controls.Add(jsDiv); 
     } 
    } 
} 

第2步 - 使您的用戶控制使用這個新的控制類: 它將繼承ScriptMoverUserControl而不是System.Web.UI.UserControl

public partial class SomeGreatControl : ScriptMoverUserControl 

第3步 - 轉儲用戶控制腳本在名爲_jsDiv DIV:

<div id="_jsDiv" runat="server"> 
    <script> 
     //some awesome JS 
    </script> 
</div> 

它一直致力於爲我好,但如果有人知道更好的/乾淨的方式,我想知道!

+0

...是的,我知道更好/更清潔的方式將是將所有的內聯JS刪除到實際的腳本文件中,並使用'RegisterStartupScript' ...但是JS中的代碼塊和JS的數量一樣,只需要更快地採用這種方法。 – MikeSmithDev

+0

我會立即嘗試。我還沒有解決這個問題。 – Remade

+0

@RemiAdeoye第一步是創建用戶控件類 - 'ScriptMoverUserControl.cs'。第2步是定期進行用戶控制,然後替換System.Web.UI。UserControl'在頂部帶有'ScriptMoverUserControl'。然後,您在用戶控件中放入'_jsDiv'的任何腳本都將被移動到'ScriptsPlace'內容佔位符中,該佔位符應該位於母版頁中的所有腳本引用之下。 – MikeSmithDev

2

您可以從代碼隱藏註冊客戶端腳本。

var clientScriptManager = Page.ClientScript; 

if(!clientScriptManager.IsStartupScriptRegistered("a_key")) { //If multiple control instances are present on the page, register scripts only once 
    RegisterStartupScript(Page.GetType(), "a_key", "<script src=\"/js/a_library.js\"></script>")); 
} 

RegisterStartupScript會在頁面的最下方添加<script>標籤,</body>之前關閉標籤。

相關問題