ASP.Net 母版页和文件路径问题
Posted
技术标签:
【中文标题】ASP.Net 母版页和文件路径问题【英文标题】:ASP.Net Master Page and File path issues 【发布时间】:2010-10-16 09:47:54 【问题描述】:我正在尝试在我的母版页中添加对 jQuery 的脚本引用,以便它适用于任何页面。目前看起来是这样的
<script type="text/javascript" src="jquery.js"></script>
问题是路径总是相对于正在执行的 aspx 页面,所以这只有在“jquery.js”文件位于同一文件夹中时才有效。为了使它起作用,我必须将行更改为:
<script type="text/javascript" src="../../jquery.js"></script>
这显然不太理想,因为它只适用于距根文件夹两层深的页面。如果我尝试以下操作,IIS 会抛出有关意外字符的错误。
<script runat="server" type="text/javascript" src="~/jquery.js"></script>
有什么想法吗?
编辑:我也忘了提到脚本必须在 head 标签中
当前的最佳答案在我将其添加到我的母版页时会引发“ASP.NET Ajax 客户端框架无法加载。”错误。它是从 javascript 而不是 .Net 编译器抛出的。如果我将 ScriptManager 移动到应该在的 head 部分,我会收到关于 ScriptManager 需要位于表单标记内的编译错误。
第三个答案从编译器抛出“路径中的非法字符。”异常
编辑 2:当我将该行添加到我的 head 标记时,我从 IIS 收到此错误。
无法修改 Controls 集合,因为该控件包含代码块(即 )
已解决:我从下面的答案中获取了编辑后的回复,并将其放入 asp:ContentPlaceHolder 元素中
【问题讨论】:
这个问题的解决方案docs.microsoft.com/en-us/aspnet/web-forms/overview/… 【参考方案1】:<script type="text/javascript" src="/full/path/to/jquery.js"></script>
【讨论】:
路径离开根目录的问题是,有时您可能会在虚拟目录中开发,然后部署到站点的根目录,反之亦然。【参考方案2】:你可以使用ScriptManager
:
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Path="~/jquery.js" />
</Scripts>
</asp:ScriptManager>
编辑:如果您绝对在您的<head>
部分需要此功能,您可以执行以下操作:
<head>
<script type="text/javascript"
src="<%= Page.ResolveClientUrl("~/jquery.js") %>"></script>
</head>
编辑 2:根据 cmets,如果您观察到
无法修改 Controls 集合,因为该控件包含代码块(即 )
您可能需要更改以上内容以使用数据绑定语法:
<head>
<script type="text/javascript"
src="<%# Page.ResolveClientUrl("~/jquery.js") %>"></script>
</head>
【讨论】:
是的,这是我在处理母版页中的路径时编写的许多 ASP.NET 书籍中强烈推荐的方法。 仅供参考,我和我的同事刚刚尝试过。这似乎不适用于嵌套母版页方案在父母版页中。然而,将它移到子母版页就可以了。 这对我几乎所有页面都有效,但有 2 个页面会因某个异常而崩溃:“控件集合无法修改,因为控件包含代码”。解决方案是将标头中包含的脚本从 response.write 代码块更改为数据绑定评估器(即 - 将 leedumond.com/blog/… 使用base href
?
@Jagd leedumond.com/blog/… 未找到【参考方案3】:
如果此脚本标记直接进入浏览器,那么您不太可能在那里替换您网站的根目录。至少不在服务器上。所以你可以:
-
将站点部署到域的根目录
命名并使用绝对路径
(最简单的解决方案)。
插入此
与服务器控制链接。
在之前预处理生成的 html
将其发送给客户端(与
HttpResponse.Filter)。
【讨论】:
【参考方案4】:如果你不去我们 asp:ScriptManager 或绝对路径,那么你可以这样做:
<script runat="server" type="text/javascript"
src='<%= Page.ResolveUrl("~/jquery.js") %>'></script>
【讨论】:
【参考方案5】:你也可以使用
<base href="http://www.domain.com"></base>
然后标题部分中的所有链接都相对于基地址:
<script type="text/javascript" src="scripts/jquery.js"></script>
当您有多个发布目标时,它通常很有用,例如本地开发 Web 服务器、演示服务器等。您只需替换该基本 URL。
【讨论】:
如何以编程方式更改base href
?【参考方案6】:
我不知道你们是否找到了解决问题的方法。我遇到了同样的问题,并且想弄清楚为什么我使用的插件会出现“jQuery is undefined”错误。我尝试了从互联网上获得的所有解决方案,但都没有运气。
但是,突然间我的脑海里闪现出一些东西,可能是脚本文件应该按顺序排列。因此,我将 jquery 引用移动到第一个位置,一切都开始像魅力一样工作。
请记住,如果您在 jquery 中使用任何插件,请确保使用以下设置对这些字段的引用的顺序。
-
对 jquery 库的引用
参考其他后续插件库等等...
例如:
-
"script src="js/jquery-1.3.2.min.js" type="text/javascript"...
"script src="js/jqDnR.min.js" type="text/javascript"...
"script src="js/jquery.jqpopup.min.js" type="text/javascript"...
"script src="js/jquery.bgiframe.min.js" type="text/javascript"...
始终确保您必须首先放置 jquery 引用,然后是后续库。
希望,这可以解决您的问题,尤其是在您使用 MasterPages 时。很奇怪,当您不使用 MasterPages 时,无论您使用什么顺序,它都能正常工作,但当您使用时,它会以某种方式要求正确的顺序。
祝你好运,编码愉快,
文森特·德索萨
【讨论】:
【参考方案7】:看看How to Run a Root “/”。这应该可以解决您关于未解决的.js
文件路径的所有问题。您基本上重新配置 VS 开发服务器以将您的应用程序作为 localhost:port/
运行,而不是常规的 localhost:port/application name/
,使名称解析的工作方式与在 IIS 上的工作方式相同。
【讨论】:
【参考方案8】:<body>
<script language="javascript" src='<%= this.ResolveClientUrl("~/full/path/to/jquery.js") %>' type="text/javascript"></script>
</body>
【讨论】:
【参考方案9】:在主页下的 head 部分尝试 <%#
而不是 <%=
<script type="text/javascript"
src="<%# ResolveUrl("~/YourScriptFolder/YourJQueryOrJavascript.js") %>">
</script>
然后在Page_Load
事件下的Master页面的代码后面
Page.Header.DataBind();
现在您可以使用 jQuery 和 JavaScript 以及 CSS,只需在 ResolveUrl
中更改您要处理 CSS、JavaScript、jQuery 的文件的路径。
【讨论】:
需要Page.Header.DataBind();
行才能为我工作,谢谢!
您可能还需要在head
标签上添加runat="server"
属性。【参考方案10】:
对于任何页面的文件的绝对路径,请使用以下内容:
<script type="text/javascript" src="<%= Page.ResolveClientUrl("~/jquery.js") %>"></script>
【讨论】:
以上是关于ASP.Net 母版页和文件路径问题的主要内容,如果未能解决你的问题,请参考以下文章