【问题标题】:Programmatically adding Javascript File to User Control in .net以编程方式将 Javascript 文件添加到 .net 中的用户控件
【发布时间】:2010-10-06 00:26:07
【问题描述】:

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

我希望用户控件是一个完整的包 - 即我不想在使用它的页面上添加与用户控件相关的 javascript,因为我可以在控件本身内部执行它。

既然用户控件中没有Page对象,你会怎么做呢?

【问题讨论】:

    标签: asp.net javascript user-controls


    【解决方案1】:

    在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标签中,只要确保head有runat="server"。

    【讨论】:

    • Gnomixa,非常好的解决方案。 +1
    • 这太酷了!我以前只是将所有脚本放在 ascx 设计页面中。但是如何处理已经将 javascript 文件添加到页眉的情况(可能是通过不同的 ascx 控件)
    • @zaladane,我从来不需要处理这种情况,因为我完全控制了加载的内容和时间。我这样做的方法是编写一个简单的函数,循环添加的内容并确保不会添加两次。但是,我认为您可以将同一个 js 文件多次添加到同一页面,最后应该不会影响任何内容。试一试,看看以确保。
    • 如果您有多个控件实例,这是不好的。请参阅下面的 baretta 帖子。
    • 在多个实例上同上。 baretta-answer 没有解决 CSS 包含问题,我通过使用带有 id 的 HtmlLink 解决了这个问题。
    【解决方案2】:

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

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

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

    【讨论】:

    • 用户特别提到他希望他的整个控件是一个“完整的包”。此解决方案假定控件添加with一个javascript文件,这不是一个完整的包。
    • 接受的答案没有嵌入 javascript 文件,是吗?
    【解决方案3】:

    和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

    【讨论】:

      【解决方案4】:

      在我的站点中,我将所有需要的脚本和样式放置到 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
      

      【讨论】:

        【解决方案5】:

        好问题!

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

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

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

        【讨论】:

        • 我使用的是网站项目而不是 Web 应用程序,所以我没有 AssemblyInfo.cs 文件。我宁愿继续使用这个模型,因为我更喜欢它而不是 web 应用程序项目。
        • 网站项目是微软的一个大错误。它非常慢,因为它为所有内容创建程序集!从好的方面来说,现在您可以将用户控件用作服务器控件。
        【解决方案6】:

        我通常在呈现控件的 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]);
            }
        

        【讨论】:

        • 可以在 ascx.cs 级别完成,或者如果控件是库中代码级别的纯代码。
        • 哦,好的,什么是 [libraryinjection]?对不起,我以前从未见过这个:) 你说的 xxx 是什么意思?类似 myscript.js 的东西?
        • 是的,这只是一个占位符,如果你想打包你的脚本有一个资源或某种性质的东西,它将是它的字符串表示,无论是什么东西 "" 或整个脚本本身。
        【解决方案7】:

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

        以下假设“GetScript()”返回您想要添加到呈现控件的实际 javascript。

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

        【讨论】:

        • 我想在单独的文件中包含 javascript。是否可以以编程方式将 JS 文件添加到用户控件?如果没有,我将只使用丹尼斯的解决方案
        • 您可以使用类似 File.ReadAllText 的方式将文件读取为字符串,然后使用该文本来注册客户端脚本块,但如果您希望将项目放在它自己的文件中,我建议 Dennis'解决方案。
        • 谢谢!哇,没想到给用户控件加个js文件这么头疼。顺便说一句,我现在在 .ascx 中有 并且它可以工作,但是由于用户控件中没有 标记,它看起来有点粗略,但我想我会坚持下去。
        【解决方案8】:

        我发现这是一种更优雅的方式来修复您的 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>
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-17
          • 1970-01-01
          • 2010-12-13
          相关资源
          最近更新 更多