我有一个用户控件,每个控件需要Javascript / Jquery。它实际上是一个使用一些javascript库以图形方式表示数据的控件。作为一种规范,我的所有JavaScript链接都位于母版页面的页面底部。这意味着我无法在控件中编写任何javascript,因为它将出现在任何依赖项之前。此外,即使脚本位于页面底部,它也只适用于第一个控件。有没有人遇到类似的挑战?我正在寻找出路。感谢
答案 0 :(得分: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>
标记。
答案 1 :(得分: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>
虽然这对用户控件不起作用...所以我做了一个有点hacky的解决方案,主要涉及将所有用户控件JS放入名为div
的{{1}}然后从代码中-behind 移动将div放入占位符(我不喜欢_jsDiv
,这对于很多代码都不实用。)
由于我在多个控件中执行了此操作,因此我执行了以下步骤:
第1步 - 制作自定义用户控件,ScriptMoverUserControl.cs:
RegisterStartupScript
第2步 - 让您的用户控件使用此新控件类:
它将继承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);
}
}
}
而不是ScriptMoverUserControl
System.Web.UI.UserControl
第3步 - 将用户控件脚本转储到名为_jsDiv的div中
public partial class SomeGreatControl : ScriptMoverUserControl
这对我来说很好,但如果有人知道更好/更干净的方式,我想知道!