问题
在使用MasterPages时,我遇到的一个常见问题是主页面中的脚本标记相对于消费页面。
例如,如果您的消费页面位于应用程序的根目录中,那么您的JavaScript可能会工作,但是当您将另一个页面放在子文件夹中时,就会出现相对路径中断,并且找不到JavaScript。在这种情况下,我不知道使用绝对路径的方法。
上一次,我决定真正地攻击这个问题,并找到一个好的解决方案。
提出的解决方案
我尝试了一种策略,那就是在Page_Load中调用Page_Load,但这似乎没有提供任何东西(当然,我对相关管道的理解是不完整的)。
我试过另一个看起来像这样的
<script language="javascript" src='<%= ResolveClientUrl("~/js/ddnmenu.js") %>' type="text/javascript"></script>
引发异常的...But :无法修改控件集合,因为控件包含代码块。
工作(但有点糟糕)代码
因此,我最终使用的是头部的一个文字控件,其中我呈现了适当的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
这是可行的,但我对此并不感兴趣,因为对于一个非常常见的问题来说,这似乎是一个有点过份的解决办法。有更好的办法吗?
发布于 2009-06-30 06:24:57
我在任何地方都使用app相关语法。它确实有一个缺点:如果您更改了应用程序名称/路径,那么您需要做大量的工作来更新您的URL。
或者,如果您正在开发根应用程序,那么:
发布于 2009-06-30 06:25:28
您可以向母版页添加一个脚本管理器,并通过它包含javascript文件:
<asp:ScriptManager ...>
<Scripts>
<asp:ScriptReference Path="~/js/ddnmenu.js" />
</Scripts>
</asp:ScriptManager>
这种方法的另一个优点是,您可以向内容页(和用户控件)中添加一个ScriptManagerProxy控件,以包含任何其他脚本。
一些第三方取代ASP:ScriptManager (例如来自泰勒克的RadControls套件或来自Ajax控制工具包)提供了更多的特性,例如将所有包含的java脚本文件合并到一个文件中(从而减少了加载页面所需的HTTP请求的数量)。
编辑:使用ScriptManager还有其他一些优点,例如您可以将脚本的调试或发布版本发送到浏览器,或者与区域性相关的脚本等等。
发布于 2009-06-30 06:28:22
我使用Page.resolveUrl("~/somefile.js");
工作起来像个冠军
https://stackoverflow.com/questions/1063947
复制