ASP.Net母版页和文件路径问题


78

我试图在我的母版页中添加对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移到应该位于其头部的位置,则会收到有关ScriptManager需要在表单标签内的编译错误。

第三个答案将引发“编译器中的非法字符”异常

编辑2:当我将该行添加到我的头标签中时,我从IIS得到此错误。

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

求助:我从下面的答案中得到编辑后的响应,并将其放在asp:ContentPlaceHolder元素中


Answers:


110

您可以使用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:根据评论,如果您观察到

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

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

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

是的,这是我在处理母版页中的路径时编写的许多ASP.NET书籍中强烈推荐的方法。
Kezzer

仅供参考,我的同事和我只是尝试了一下。这似乎在父母版页的嵌套母版页方案不起作用。但是,将其移到子母版页上就可以了。
technomaologic

3
这几乎对我所有的页面都有效,但是对于2个页面,这些页面会因某些异常而崩溃:“由于控件包含代码,因此无法修改控件集合”。解决方案是将标头中包含的脚本从response.write代码块更改为数据绑定评估器(即-将<%=更改为<%#)。我可能会猜测,这是MS阻止HTTP标头攻击的某种尝试。可以在以下网址
Jagd

使用base href
PreguntonCojoneroCabrón


25

尝试在标题下面的“母版页”中<%#代替<%=

<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();它为我服务,谢谢!
布伦丹·汉尼曼

您可能还需要runat="server"head标签上添加属性。
Alex

11

如果您不打算使用asp:ScriptManager或绝对路径,则可以这样做:

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

3

我不知道你们是否找到解决问题的方法。我面临着同样的问题,并且要弄清楚为什么我使用的插件会出现“ jQuery is undefined”错误。我尝试了从互联网上获得的所有解决方案,但是一点都没有运气。

但是,突然之间我想到了一些可能是脚本文件应该整齐的东西。因此,我将jquery裁判移到了第一个位置,并且一切开始像魅力一样工作。

记住,如果您在jquery中使用任何插件,请确保使用对这些字段的引用设置遵循以下顺序。

  1. 引用jQuery库
  2. 引用其他后续插件库等...

例如:

  1. “脚本src =” js / jquery-1.3.2.min.js“ type =” text / javascript“ ...
  2. “脚本src =” js / jqDnR.min.js“ type =” text / javascript“ ...
  3. “脚本src =” js / jquery.jqpopup.min.js“ type =” text / javascript“ ...
  4. “脚本src =” js / jquery.bgiframe.min.js“ type =” text / javascript“ ...

始终确保必须将jquery引用放在第一个,然后放在后面的库。

希望这可以解决您的问题,尤其是当您与MasterPages一起使用时。非常奇怪的是,无论您不使用MasterPages还是使用MasterPages,无论使用什么顺序,它都可以工作,然后它以某种方式要求正确的顺序。

祝您好运,编码愉快,

文森特·杜萨(Vincent D'Souza)


3

查看如何运行根目录“ /”。这应该可以解决有关未解决的.js文件路径的所有问题。基本上,您需要重新配置VS Dev服务器以运行您的应用程序,localhost:port/而不是localhost:port/application name/像在IIS上那样以常规方式 进行名称解析。



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

2
离开根目录的路径的问题是,有时您可以在虚拟目录中进行开发,然后再部署到站点的根目录,反之亦然。
StuartLC'3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.