2013-12-12 49 views
0

我有一个用户控件,它需要每个控件的Javascript/jquery。它实际上是一个用图形表示使用一些JavaScript库的数据的控件。作为规范,我的所有javascript链接都位于主页面的页面底部。这意味着我不能在控件中编写任何JavaScript,因为它会出现在它的任何依赖关系之前。另外,即使脚本位于页面的底部,它也只适用于第一个控件。有没有人遇到类似的挑战?我正在寻找出路。谢谢Asp.Net:用户控件,JavaScript和JavaScript库

+0

您可能需要添加更多具体细节,否则它看起来有现有的答案。 http://stackoverflow.com/questions/1703601/where-do-i-put-javascript-when-using-an-asp-net-user-control –

回答

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> 

尽管这不会对用户控件工作...所以我做了,基本上涉及到把所有的用户控件JS的成div名为_jsDiv,然后从后台代码移动有点哈克解决方案将div放入占位符中(我不喜欢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> 

它一直致力于为我好,但如果有人知道更好的/干净的方式,我想知道!

+0

...是的,我知道更好/更清洁的方式将是将所有的内联JS删除到实际的脚本文件中,并使用'RegisterStartupScript' ...但是JS中的代码块和JS的数量一样,只需要更快地采用这种方法。 – MikeSmithDev

+0

我会立即尝试。我还没有解决这个问题。 – Remade

+0

@RemiAdeoye第一步是创建用户控件类 - 'ScriptMoverUserControl.cs'。第2步是定期进行用户控制,然后替换System.Web.UI。UserControl'在顶部带有'ScriptMoverUserControl'。然后,您在用户控件中放入'_jsDiv'的任何脚本都将被移动到'ScriptsPlace'内容占位符中,该占位符应该位于母版页中的所有脚本引用之下。 – MikeSmithDev

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>之前关闭标签。

相关问题