在www.example.com路径中使用代字号(~)asp.net

falq053o  于 2023-01-27  发布在  .NET
关注(0)|答案(6)|浏览(162)

我在一个www.example.com应用程序工作,下面的链接在IE中工作,但在FF中不.asp.net app, the following link works in IE but not in FF.

<a href="~/BusinessOrderInfo/page.aspx" >

波浪号不是只能在www.example.com服务器控件中使用吗?在那里它将被实际路径替换?asp.net server controls. Where it will be replaced by an actual path?
可以在锚标签中使用波浪号吗?如果可以,它是什么意思?
当我在根目录时,链接有效

www.myserver.com/default.aspx, click the link, ok!

www.myserver.com/otherpart/default.aspx, click the link, not ok!

ASP.NET生成的链接为:

www.myserver.com/otherpart/~BusinessOrderInfo/page.aspx

这是故意的吗?

xurqigkl

xurqigkl1#

你说得对,它只在服务器控件中有效。你有以下基本选项:
更改为HyperLink以作为Web Control运行:

<asp:HyperLink NavigateUrl="~/BusinessOrderInfo/page.aspx" Text="Whatever" runat="server" />

或者,在服务器端以HTML Control

<a href="~/BusinessOrderInfo/page.aspx" runat="server" >

或者,使用Page.ResolveUrl

<a href="<%= Page.ResolveUrl("~/BusinessOrderInfo/page.aspx") %>">...</a>
9jyewag0

9jyewag02#

HTML控件可以通过添加runat=“server”属性转换为服务器控件。

<a href="~/BusinessOrderInfo/page.aspx" runat="server">
dgenwo3n

dgenwo3n3#

波浪号引用应用程序根目录,并将在控件属性(如NavigateUrl)中正确转换。
我的理解是,如果您在纯HTML标记中使用它,ASP.NET将不会翻译它。

30byixjq

30byixjq4#

此函数还可用于解析非服务器元素的路径

VirtualPathUtility.ToAbsolute($"~/App_Themes/Default/Icons/myimage.gif")
i34xakig

i34xakig5#

如果您删除波浪号并只使用正斜杠,您将获得相同的结果,即指向当前域中的根文件夹:

<a href="/BusinessOrderInfo/page.aspx" >
4uqofj5v

4uqofj5v6#

在ASP.NET中使用Web路径和波浪号“~”

  1. ~/不属于HTML、CSS或JavaScript路径系统。
  2. ~/是仅ASP.NET或第三方产品使用的人工路径解析字符。
  3. ~/是Web服务器的唯一路径,服务器上运行的代码会将其转换为新路径。
  4. ~/是一个字符,它告诉IIs Windows Server上的ASP.NET查找您的网站的“应用程序根目录”。
  5. ~/解析为“虚拟路径”,因为它告诉服务器查找由服务器上给定AppDomain控制的ASP .NETWeb应用程序的虚拟根目录或应用程序根目录,并从新的虚拟根目录解析它。
  6. ~/在大多数情况下会解析为域名后面的任何网站的web根目录,无论您在哪个页面或子文件夹中调用该路径。在几乎所有情况下,这都会解析为/。因此,除非您在服务器上设置了Virtual Application,否则两者在大多数情况下是相同的。
  7. ~/仅在您的网站在IIs等Web服务器中使用一个或多个Virtual Applications时才真正有用。这些是您的Web域中的人造子应用程序,它们在Web根目录下添加新文件夹或路径**,这些根目录并不真正存在**,但代表由服务器管理的独立应用程序和进程。这通常会在您的域中创建一个或多个虚拟应用程序文件夹在一个域下运行ASP.NET网站的不同示例时,ASP.NET和IIs管理的IIs中。请参见下面...
    虚拟Web应用程序
    过去,我们常常在IIs Web Server中创建虚拟应用程序,以创建两个以上的Web路径,从而隔离使用同一域的一个或多个Web“体验”。每个虚拟路径可能是一个“ghost”路径,指向Web根目录,但在Web根目录下创建一个额外的ghost文件夹。在许多情况下,这个新的虚拟路径指向一个物理文件夹,而不是普通的web路径,或者甚至是计算机硬盘驱动器路径,或者Map。ASP.NET,然后从那里运行web站点代码。向Web域的访问者显示的新虚拟路径将显示为主站点的一部分,但使用ASP.NET运行的单独进程(单独的AppPool或辅助进程)运行Web应用程序的第二个示例。
    ~/在这些情况下非常有用。它被用于路径解析,并轻松Map到这些新的虚拟应用程序根目录或服务器创建的路径,允许您在一个网站下运行多个应用程序,而不更改ASP.NET代码中的路径。然后,服务器端代码将为您解析每个虚拟应用程序中的路径,而不更改代码库。
    在这些情况下,~/非常有价值,因为如果应用程序在一个网站下具有不同Web根目录的多个虚拟Web应用程序中运行,您不再需要为每个应用程序管理Web应用程序中的多个路径。它始终可以使用~/而不是始终为http://example.com/的真正Web根目录在每个应用程序中找到新的根目录
    实施例
    使用~/的ASP.NET中的大多数路径在没有虚拟应用程序的普通网站中解析为/,并将所有路径指向以下URL的Web根。**在大多数情况下,这就是为什么ASP.NET ~/是多余的。**只需使用/。两者都指向Web根:
https://example.com/

但是,如果您向域中添加了虚拟目录,如下面的示例所示,则每个单独的Web应用程序中的~/将解析为两个不同的Web根目录:

https://example.com/virtualapplication1/
https://example.com/virtualapplication2/

在ASP.NET的早期,我总是使用下面的代码获取应用程序路径,并将其存储在一个全局变量中。这使我能够完全控制从域根目录或虚拟根目录的相对应用程序Web根目录开始的所有路径,无论我的Web应用程序被移动到哪里。但是这个路径是~/很久以前所取代的。然而,它仍然可能更好,因为您可以在服务器上动态地从它构建路径:

var myWebRoot = HttpContext.Current.Request.ApplicationPath;

我的观点是像这样的虚拟应用程序现在很少使用,因为域很便宜,经常使用子域代替,如下所示:

https://app1.example.com/
https://app2.example.com/

所有的网页路径都应该使用绝对路径/。例外的是CSS路径是相对于页面源页面或代码内部调用他们。许多人说,这意味着这些绝对网页路径打破如果你移动他们。但我认为,为什么你需要引用根为您的网站,然后突然改变呢?如果你这样做,应该在服务器端管理并注入到HTML和JavaScript中,而不是相反。
其次,许多基于UNIX的开放源代码供应商正在创建JavaScript API库,这些库在HTML和CSS不支持的 * 点路径 * 方面遇到困难,例如./.

这些是UNIX约定,只是指指向本地文件夹或调用代码所在的同一文件夹。这与NO PATH相同,所以为什么要使用它呢?有使用它们的情况,但最终结果对Web路径没有任何影响。所以我会避免使用它们。它们在JavaScript中可靠工作的唯一地方是ECMAScript中的新JavaScript模块。但在专有API中,如Google Angular,它们是必需的。
例如,这两个使用UNIX本地路径约定(使用./.)的图像路径在HTML中都失败,并创建丢失图像错误

// These return broken image icons in browsers when using
// these unconventional UNIX local dot path conventions on the Web:
<img id="image1" src="./images/image1.png" />
<img id="image2" src="/images/.image2.png" />

因此,避免所有这些偏离路径系统和坚持使用/绝对HTML路径和您的代码将永远工作几十年来!

相关问题