ASP.Net 主页面和文件路径问题

80

我想在我的母版页中添加一个对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需要位于form标记内部的编译错误。

第三个答案会抛出一个编译器"路径中存在非法字符。"异常

编辑2:当我将那行代码添加到我的head标签时,IIS会显示此错误。

Controls集合无法修改,因为控件包含代码块(即<%...%>)。

解决:我使用下面答案的编辑响应并将其放置在asp:ContentPlaceHolder元素中


这个问题的解决方案:https://learn.microsoft.com/zh-cn/aspnet/web-forms/overview/older-versions-getting-started/master-pages/urls-in-master-pages-cs - Pranesh Janarthanan
10个回答

111

你可以使用一个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: 根据评论,如果您注意到以下情况:

控件包含代码块(即 <% ... %>),因此无法修改 Controls 集合。

您可能需要更改上述内容以使用数据绑定语法:

<head>
    <script type="text/javascript" 
        src="<%# Page.ResolveClientUrl("~/jquery.js") %>"></script>
</head>

哎呀,这是我写的很多 ASP.NET 书籍中在处理母版页路径时强烈推荐的方法。 - Kieran Senior
供参考,我和我的同事刚试过了。在嵌套的母版页情况下,在父母版页中似乎不起作用。然而,将它移动到子母版页中,则解决了问题。 - technomalogical
3
这个方法几乎对我所有的页面都有效,但对于两个页面却会出现一个特定的异常:“由于控件包含代码,因此无法修改控件集合”。解决方法是将页头中的脚本 include 从 response.write 代码块更改为数据绑定评估器(即 - 将 <%= 更改为 <%#)。我猜测这可能是微软试图阻止 HTTP 标头攻击的一种尝试。有关这种简单修复的更好解释可以在以下链接找到:http://leedumond.com/blog/the-controls-collection-cannot-be-modified-because-the-control-contains-code-blocks/ - Jagd
ScriptReference 没有在 head 部分添加脚本? - Kiquenet
使用 PlaceHolder https://dev59.com/K3RA5IYBdhLWcg3w8SeJ - Kiquenet
显示剩余2条评论

27

在Master页的head部分中使用<%#替代<%=

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

然后,在主页面的代码后台,在Page_Load事件下面进行操作。

Page.Header.DataBind();

现在你可以使用jQuery、JavaScript或CSS,只需要在ResolveUrl中更改你想要处理的CSS、JavaScript、jQuery文件的路径即可。


1
需要添加 Page.Header.DataBind(); 这行代码才能让它对我起作用,谢谢! - Brendan Hannemann
您可能还需要在head标记上添加runat="server"属性。 - Alex

12
如果您不使用asp:ScriptManager或绝对路径,则可以按照以下方式执行此操作:
<script runat="server" type="text/javascript" 
  src='<%= Page.ResolveUrl("~/jquery.js") %>'></script>

3
我不知道你们是否已经找到了解决方法。我遇到了同样的问题,竭尽全力想弄清楚为什么我使用的插件会出现“jQuery未定义”的错误。我尝试了从互联网上获得的所有解决方案,但都没有运气。
但突然有些东西在我的脑海中闪现,那就是脚本文件应该按顺序排列。所以,我将jquery引用移到第一位,一切都像魅力一样开始工作了。
记住各位,如果您正在使用与jquery相关的任何插件,请确保按以下设置引用这些文件的顺序。
  1. 对jquery库的引用
  2. 对其他后续插件库的引用等等...
例如:
  1. "script src="js/jquery-1.3.2.min.js" type="text/javascript"...
  2. "script src="js/jqDnR.min.js" type="text/javascript"...
  3. "script src="js/jquery.jqpopup.min.js" type="text/javascript"...
  4. "script src="js/jquery.bgiframe.min.js" type="text/javascript"...
始终确保您必须首先放置jquery引用,然后是后续的库。
希望这解决了您的问题,特别是当您与MasterPages一起使用时。很奇怪的是,当您不使用MasterPages时,无论使用什么顺序都可以工作,但当您这样做时,它会以某种方式要求正确的顺序。
祝你好运和愉快的编码,
Vincent D'Souza

3
请查看如何运行根目录“/”。这将解决所有涉及未解决的.js文件路径的问题。您需要重新配置VS Dev服务器以将应用程序作为localhost:port/运行,而不是常规的localhost:port/application name/,从而使名称解析与IIS上的工作方式相同。

1

对于任何页面的文件的绝对路径,请使用以下内容:

<script type="text/javascript" src="<%= Page.ResolveClientUrl("~/jquery.js") %>"></script> 

0
<body>
<script language="javascript" src='<%= this.ResolveClientUrl("~/full/path/to/jquery.js") %>' type="text/javascript"></script>
</body>

0
<script type="text/javascript" src="/full/path/to/jquery.js"></script>

2
路径问题在于有时您可能会在虚拟目录中进行开发,然后部署到站点的根目录,或者反过来。 - StuartLC

0

如果这个脚本标签直接传递到浏览器,那么你不太可能在服务器上替换你的站点根目录。所以你可以:

  1. 将站点部署到域名的根目录,并使用绝对路径(最简单的解决方案)。
  2. 使用服务器控件插入此链接。
  3. 在将 HTML 发送到客户端之前预处理它(使用 HttpResponse.Filter)。

0

您也可以使用 <base> HTML 标签:

<base href="http://www.domain.com"></base>  

然后头部区域中的所有链接都是相对于基础地址的:

<script type="text/javascript" src="scripts/jquery.js"></script>

当你有多个发布目标时,例如本地开发Web服务器、演示服务器等,替换基础URL通常非常有用。


如何通过编程方式更改“base href”? - PreguntonCojoneroCabrón

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接