繁体   English   中英

Asp.Net:用户控件,JavaScript和JavaScript库

[英]Asp.Net: User controls, javascripts and javascript libraries

我有一个用户控件,每个控件都需要Javascript / Jquery。 实际上,它是使用某些javascript库以图形方式表示数据的控件。 通常,我所有的javascript链接都位于母版页的底部。 这意味着我无法在控件中编写任何JavaScript,因为它将出现在其任何依赖项之前。 同样,即使脚本位于页面底部,它也仅适用于第一个控件。 有没有人遇到过类似的挑战? 我正在寻找出路。 谢谢

您可以从后台代码注册客户端脚本。

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>结束标记之前的<script>标记。

我遇到了类似的问题,即“更新”具有大量内联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到占位符(I”我不喜欢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>

这对我来说一直很好,但是如果有人知道更好/更干净的方式,我想知道!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM