WebForms:MasterPages中的动态(或绝对)脚本标记

时间:2009-06-30 14:19:15

标签: asp.net webforms master-pages

问题

使用MasterPages时,我遇到的一个常见烦恼是master中的脚本标签与消费页面相关。

因此,例如,如果您的消费页面位于应用程序的根目录中,那么您的JavaScript可能会起作用,但是当您将另一个页面放在子文件夹中时,相对路径会中断,并且找不到JavaScript。在这种情况下,没有办法使用我所知道的绝对路径。

最后一次,我决定真正攻击这个并找到一个好的解决方案。

提议的解决方案

我尝试了一种围绕在Page_Load中调用ClientScriptManager.RegisterClientScriptInclude的策略,但这似乎没有呈现任何内容(授予,我对相关管道的理解不完整)。

我尝试了另一个看起来像这样的东西:

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

...但是会引发异常:无法修改Controls集合,因为控件包含代码块。

工作(但有点难看)代码

所以,我最终得到的是Head中的Literal控件,我在其中呈现相应的Html:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Me.SetupLiteralScriptsTag()
End Sub

Private Sub SetupLiteralScriptsTag()
    'Build the script tags to import our JavaScript
    Dim Builder As New StringBuilder

    Builder.AppendLine(String.Format("<script type=""text/javascript"" src=""{0}""""></script>", ResolveClientUrl("~/js/jquery-1.3.2.min.js")))
    Builder.AppendLine(String.Format("<script type=""text/javascript"" src=""{0}""""></script>", ResolveClientUrl("~/js/jquery.corners.min.js")))
    Builder.AppendLine(String.Format("<script type=""text/javascript"" src=""{0}""""></script>", ResolveClientUrl("~/js/bg.pos.js")))
    Builder.AppendLine(String.Format("<script type=""text/javascript"" src=""{0}""""></script>", ResolveClientUrl("~/js/moonstone.js")))

    Me.LiteralScriptTags.Text = Builder.ToString
End Sub

这很有效,但是我并没有对此感到嗤之以鼻,因为对于一个非常常见的问题来说,似乎有点过多的解决方法。有没有更好的办法?

5 个答案:

答案 0 :(得分:7)

您可以将scriptmanager添加到母版页并通过以下内容包含javascript文件:

<asp:ScriptManager ...>
  <Scripts>
    <asp:ScriptReference Path="~/js/ddnmenu.js" />
  </Scripts>
</asp:ScriptManager>

该方法的另一个优点是,您可以将ScriptManagerProxy控件添加到内容页面(和用户控件)以包含任何其他脚本。

ASP的一些第三方替换:ScriptManager(例如来自telerik的RadControls套件或来自Ajax control toolkit)提供了更多功能,例如将所有包含的java脚本文件合并到一个文件中(从而减少了加载页面所需的HTTP请求数量。)

修改: 使用ScriptManager还有一些其他优点,例如:您可以将脚本的调试版本或发布版本发送到浏览器或依赖于文化的脚本等。请查看this page in MSDN以获取概述。

答案 1 :(得分:3)

我到处都使用app相对语法。它确实有一个缺点,如果您更改应用程序名称/路径,那么您有很多工作要做更新所有URL。

&lt; script language =“javascript”src =“/ MyAppName / Includes / MyJavascriptFile.js”&gt;

或者如果你正在使用root应用程序,那么:

&lt; script language =“javascript”src =“/ Includes / MyJavascriptFile.js”&gt;

答案 2 :(得分:1)

我使用Page.resolveUrl("~/somefile.js");

像冠军一样工作

答案 3 :(得分:0)

您可以始终从根引用您的脚本。 IE:

<script language="javascript" src="/scripts/file.js"></script>

您应用中的任何页面都会正确获取javascript。

此外,由于您使用的是ASP.NET,因此可以使用“〜”字符来提供基于应用程序的相对路径。见Rick Strahl's article on ASP.NET paths for more info.

答案 4 :(得分:0)

  

无法修改Controls集合,因为控件包含代码块

这个错误听起来很熟悉。当我摸索通过这个时,This页帮助了