以编程方式将Javascript文件添加到.net中的用户控件

时间:2009-02-06 18:48:05

标签: asp.net javascript user-controls

如何以编程方式将Javascript文件添加到用户控件?

我希望用户控件是一个完整的包 - 也就是说,当我可以在控件本身内部进行操作时,我不想在页面上添加与用户控件相关的javascript。

由于用户控件中没有Page对象,你会怎么做?

8 个答案:

答案 0 :(得分: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”。

答案 1 :(得分:8)

您可以使用ClientScriptManager注册客户端脚本。 可以通过Control.Page属性访问页面。

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

编辑:对不起,对于一个完整的“完整包”,可以使用脚本作为嵌入式资源, 并通过WebResource.axd处理程序获取动态URL。 如果这不被认为是完全完整的,那么我想它可以放在App_LocalResources中,但它永远不会只是一个文件, 除非代码和脚本是内联的。

答案 2 :(得分:6)

与gnomixa的回应相同,只是更清洁一点:

HtmlGenericControl js = new HtmlGenericControl("script");
js.Attributes["type"] = "text/javascript";
js.Attributes["src"] = "jscript/formfunctions.js";
Page.Header.Controls.Add(js);

来自http://www.aspdotnetfaq.com/Faq/How-to-Programmatically-add-JavaScript-File-to-Asp-Net-page.aspx

答案 3 :(得分:3)

在我的网站中,我将所有需要的脚本和样式放到placeHolder

<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

答案 4 :(得分:2)

好问题!

UserControl应该是一个包,不依赖于JavaScript或CSS文件。您需要将JS和CSS文件作为嵌入式资源。右键单击属性并将构建操作设置为嵌入资源。然后,您需要将JavaScript和CSS文件作为WebResources注入。

这是我昨天写的一篇文章,讨论了同样的情况:

http://highoncoding.com/Articles/502_Creating_RadioButton_Validation_Using_Custom_Validator.aspx

答案 5 :(得分: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]);
    }

答案 6 :(得分:0)

如果您的.CS文件中包含实际javascript的文本,则可以调用Page.ClientScript.RegisterClientScriptBlock。

以下假设“GetScript()”返回要添加到渲染控件的实际 javascript。

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

答案 7 :(得分: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>

这样,无论您将用户控件添加到哪个子文件夹/页面,都可以正确解析脚本链接。