2009-02-06 38 views
16

如何以編程方式將Javascript文件添加到用戶控件?在.net中以編程方式向用戶控件添加Javascript文件

我想讓用戶控件成爲一個完整的包 - 也就是說,我不想在用戶控件的頁面上添加與用戶控件相關的JavaScript,當我可以在控件本身內部進行操作時。

由於用戶控件中沒有頁面對象,你會怎麼做?

回答

26

在control.ascx.cs文件的Page_Load方法:

LiteralControl jsResource = new LiteralControl(); 
jsResource.Text = "<script type=\"text/javascript\" src=\"js/mini-template-control.js\"></script>"; 
Page.Header.Controls.Add(jsResource); 

HtmlLink stylesLink = new HtmlLink(); 
stylesLink.Attributes["rel"] = "stylesheet"; 
stylesLink.Attributes["type"] = "text/css"; 
stylesLink.Href = "css/mini-template-control.css"; 
Page.Header.Controls.Add(stylesLink); 

這將加載css和Javascript插入到主頁面的head標籤中,只要確保頭部有runat =「server」即可。

0

我通常在爲控件呈現HTML時根據它是庫注入還是實例注入來執行操作,我使用Items集合來指定是否已經爲此類型的控件生成代碼當前請求使用唯一標識符。

某事的效果:

protected override void Render(HtmlTextWriter writer) 
    { 
     base.Render(writer); 

     //Check if the Object Script has already been rendered during this request. 
     if (!Context.Items.Contains("xxx")) 
     { 
      //Specify that the Object Script has been rendered during this request. 
      Context.Items.Add("xxx", string.Empty); 
      //Write the script to the page via the control 
      writer.Write([libraryinjection]); 
     } 
     //Write the script that instantiates a new instance for this control 
     writer.Write([instanceinjection]); 
    } 
+0

我假設這是在.ascx.cs文件內完成的? – sarsnake 2009-02-06 19:06:49

+0

它可以在ascx.cs級別完成,或者如果控件是庫中代碼級別的純代碼。 – 2009-02-06 19:14:38

+0

哦好吧,whats [libraryinjection]?原諒我,我從來沒有見過這個:) 和你是什麼意思的xxx?有點像myscript.js? – sarsnake 2009-02-06 19:25:43

8

可以客戶端腳本包括使用ClientScriptManager註冊。通過Control.Page屬性可以訪問頁面 。

Page.ClientScript.RegisterClientScriptInclude (
    typeof (MyControl), "includeme.js", "js/includeme.js" ); 

編輯:對不起,共計「完整的軟件包」,它可以使用腳本作爲嵌入式資源, 和AQUIRE動態URL的通過WebResource.axd處理。 如果這不被認爲是完全的,那麼我想它可以放在App_LocalResources中,但它永遠不會只是一個文件, ,除非代碼和腳本是內聯的。

+0

用戶特別提到他希望他的整個控制是一個「完整的包」。該解決方案假設控件是與_with_ javascript文件一起添加的,該文件不是完整的包。 – 2009-02-06 19:00:57

0

如果您的.CS文件中包含實際javascript的文本,則可以調用Page.ClientScript.RegisterClientScriptBlock。

以下假設「GetScript()」返回實際的您要添加到呈現的控件的javascript。

Page.ClientScript.RegisterClientScriptBlock(GetType(), "controlScriptName", GetScript()); 
3

在我的地盤我將所有需要的腳本和樣式佔位

<asp:placeHolder runat="Server" ID="phHead"> 
    <script src="/header/widget/script.js" type="text/javascript"></script> 
    <link href="/header/widget/style.css" rel="stylesheet" type="text/css" /> 
</asp:placeHolder> 

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Page.Header.Controls.Add(phHead) 
End Sub 
0

我發現這是一個更優雅的方式來修復鏈接到您的JavaScript。
在你的.ascx,鏈接到你的腳本文件的方式如下:

<script src='<%= ResolveClientUrl("~/Scripts/jquery-1.7.1.min.js") %>' type="text/javascript"></script> 
<script src='<%= ResolveClientUrl("~/Scripts/jquery.maskedinput-1.3.min.js") %>' type="text/javascript"></script> 

這樣一來,無論你把你的用戶控件,鏈接到你的腳本能正確地解決其子文件夾/頁。

相關問題