![](/img/trans.png)
[英]user controls in asp.net prefixing string to child controls causing problem to refer them in 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.