2009-12-30 16 views
1

我想在我的代码中将js和css包含在我的母版页和Page_Load事件中的用户控件中。在Master网页中包含Javascript和css和在asp.net中的用户控件

但显然,自从用户控件的Page_Load加载母版页的Page_Load之前,js会中断。我在我的母版页中包含了跨站点使用的jquery库,但用户控件中使用的脚本仅包含在用户控件中。问题是用户控件js脚本使用jquery功能(因为它应该),但是当它试图运行时,由于jquery库尚未加载,所以它会中断。 Anwyays,有没有办法解决这个令人沮丧的混乱?

我用这个在后面的代码中包含js。 relativeResolvedPath基本上是RESOLVEURL(URL)

HtmlGenericControl js = new HtmlGenericControl("script"); 
    js.Attributes.Add("type", "text/javascript"); 
    js.Attributes.Add("src", relativeResolvedPath); 
    Page.Header.Controls.Add(js); 

回答

0

可以更好地解决您的问题。在您的母版页中使用Page_Init可使代码在子页面和UserControl Page_Load事件之前运行。

不要忘记做偶尔的“查看源代码”作为完整性检查。你必须确保东西按照你期望的顺序进入响应。

在用户控件中使用的客户端脚本在响应发送到用户代理之前不会执行,因此只要响应中早些包含jQuery库,您应该没问题。这实际上并不是生命周期问题,除非您将服务器代码与您要发送的客户端代码混合在一起。

我有这个在我的母版

<link rel="shortcut icon" href="<%#ResolveUrl("~/favicon.ico") %>" /> 
    <script type="text/javascript"> 
     var applicationRoot = "<%# webController.AppUrl %>"; 
    </script> 
    <asp:Literal ID="litJqueryMinified" runat="server" /><asp:PlaceHolder id="phjQuery" runat="server"><script src="Script/jquery-1.3.2.js" type="text/javascript"></script></asp:PlaceHolder> 
    <asp:Literal ID="litJqueryUIMinified" runat="server" /><asp:PlaceHolder id="phjQueryUI" runat="server"><script src="Script/jquery-ui-1.7.2.custom.min.js" type="text/javascript"></script></asp:PlaceHolder> 
    <script src="<%#ResolveUrl("~/Script/jquery.fancybox-1.2.1.pack.js") %>" type="text/javascript"></script> 
    <script src="<%#ResolveUrl("~/Script/jquery.maskedinput-1.2.2.min.js") %>" type="text/javascript"></script> 
    <script src="<%#ResolveUrl("~/Script/jquery.cycle.all.min.js") %>" type="text/javascript"></script> 

的头,这在代码隐藏:

 // Swap the jQuery inlcude for the minified version 
     phjQuery.Visible = false; 
     phjQueryUI.Visible = false; 
     string jQueryAddress = currentSettings != null && currentSettings["jQueryLocation"] == "local" ? ResolveUrl("Script/jquery-1.3.2.min.js") : "https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"; 
     string jQueryUIAddress = currentSettings != null && currentSettings["jQueryLocation"] == "local" ? ResolveUrl("Script/jquery-ui-1.7.2.custom.min.js") : "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"; 
     litJqueryMinified.Text = "<script src=\"" + jQueryAddress + "\" type=\"text/javascript\"></script>"; 
     litJqueryUIMinified.Text = "<script src=\"" + jQueryUIAddress + "\" type=\"text/javascript\"></script>"; 

这让我有它精缩或在生产由谷歌托管的,但使用开发完整版,智能感知。

不要在您的Page_Load忘记这一点得到RESOLVEURL工作:

  Page.Header.DataBind(); 

希望这有助于。 :)

+0

谢谢!我追踪了init和load事件的执行顺序,并确定您的解决方案已经足够了! – sarsnake

+0

太棒了。请注意,网页甚至包含PreInit,但主页不包含。 – Chris

1

首先,Page.Controls.Add将在你的HTML文档中的任意位置添加脚本块。您应该只在页眉底部或页面底部添加脚本文件(在线搜索会告诉您页面底部是更好的UI性能的首选)。

为了确保您的JavaScript文件的正确顺序,我会查看ASP.Net AJAX Script LoaderScript Manager

如果按照正确的顺序添加脚本,则Script Manager将起作用。使用AJAX Script Loader

+0

我纠正我的代码。我使用Page.Header.Controls.Add,而不是Page.Controls.Add。我证实所有脚本都被添加到标题中,所以这不是问题。 – sarsnake

+0

我明白这个问题。脚本标签应该驻留在哪里是一个侧面。为了解决你的问题,我会研究AJAX脚本加载器。一个简单的解决方案是将脚本加载到用户控件的页面底部,并从主页面的顶部加载。 –

1

使用ScriptManager。这很容易:

<asp:ScriptManager ID="SM1" runat="server"> 
    <Scripts> 
    <asp:ScriptReference Name="Script.js" /> 
    </Scripts> 
</asp:ScriptManager> 

为了使它更容易,你只需要添加一个空脚本管理器控制您的母版:

<asp:ScriptManager ID="MasterPageScriptManager" runat="server" /> 

而且脚本经理代理的所有网页/控制,这将有自定义脚本加载:

<asp:ScriptManagerProxy ID="SM1" runat="server"> 
    <Scripts> 
    <asp:ScriptReference Name="Script.js" /> 
    </Scripts> 
</asp:ScriptManagerProxy> 

编辑:如果这不是你要找的,我很抱歉。这听起来像你只是试图找出脚本的正确位置。如果是这样的话,你可以做的另一件事是,包括jQuery的在你的母版和任何未来的脚本为:

<script type="text/javascript" src='<%= ResolveUrl("~/js/script.js") %>'></script> 

我会建议不要从代码隐藏加载JavaScript,除非你要么动态生成的JavaScript代码,或者您正在构建应用程序并将其发布给某人来调整UI,并且您不希望该功能被篡改。

如果你加载警报或类似的东西,使用类似:

string myScript = "$(document).ready(function() { alert('message');});"; 
Page.ClientScript.RegisterClientScriptBlock(this.Page.GetType(), "alerting", myScript, true); 
+0

所以我不能让JS从后面的ascx文件后面的代码注入头部?从本质上讲,我想要的是一个自包含的用户控件 - 就像 - 我不需要在使用用户控件的页面上包含任何js - 我希望它可以随时用于所有的CSS和js自动加载到它。当然,我可以在主页面中包含用户控件的脚本,但这似乎是错误的。它们不需要包含在那里 - 它们只需要包含在使用用户控件的地方。这是非常令人沮丧的 - 不确定什么.net创作者。 – sarsnake

+0

明天上班时我会试试你的解决方案,谢谢! – sarsnake

相关问题