首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[转]ASP.NET 路径问题详解

Posted on 2010-05-14 17:14  达奇  阅读(1012)  评论(0编辑  收藏  举报

    各位有没有碰到在日常工作中经常在路径设置的时候把 "~/ 、./ 、../ 、 / 、http://www.cnblogs.com/"这些符号搞混搞乱了?偶尔还会因路径的问题郁闷了半天 还以为是程序上出了问题了。以下我是转自--脚本之家 里的一篇技文,略作修改,以备不时只需,各位有需要的也可参考参考,有错的也请各位指出。

     比如你的工程是Webapplication1(url是:http://localhost/webapplication1/webform1.aspx)
Request.ApplicationPath 就是/Webapplication1
如果是站点就直接返回"/";
------------------------------------------------------
~/ 可以用在需要设置路径的控件比如:imagebutton,image等 以及链接ascx文件,配置文件.
../ 的好处是可以不知道文件夹的名字知道层次结构就可以了
/ 的好处是针对根路径,如果本地目录和服务器目录一致,那直接用/就可以保证路径正确,这种情况很少.
Request.ApplicationPath 注意如果没有虚拟目录就直接返回/,那你程序里面就不要设置/
比如
Request.ApplicationPath+"/images/a.gif" 如果是站点 就是等于 "//images/a.gif",错误的
如果有虚拟目录就是 "Webapplication1/images/a.gif"
没有/的
Request.ApplicationPath 发挥虚拟目录名称,如果是站点就返回/
~/ 类似,不过只用服务端的空间可以识别;
/  针对目录
./  当前目录
../ 相对当前目录的上层目录
比如你的工程是Webapplication1(url是:http://localhost/webapplication1/webform1.aspx)
Request.ApplicationPath 就是Webapplication1/
~/ 也是 Webapplication1/
/就是http://localhost/
如果webform1.aspx 下有个文件webform2.aspx
你可以在webform1.aspx里这样使用
<a href=webform2.aspx>ddd</a>
或者
<a href=/webapplication1/webform2.aspx></a>
或者
<a href=../webform2.aspx></a>

ASP.NET 网站路径
使用网站中的资源时,通常必须指定资源的路径。例如,您可以使用 URL 路径引用页面中的图像文件或网站中其他位置处的页面的 URL。同样,Web 应用程序中的代码可以使用基于服务器的文件的物理文件路径对文件进行读写操作。ASP.NET 提供用于引用资源并确定应用程序中的页面或其他资源的路径的方法。

指定资源的路径
许多情况下,页面中的元素或控件必须引用外部资源,如文件。ASP.NET 支持引用外部资源的各种方法。根据您使用的是客户端元素还是 Web 服务器控件,选择的引用方法将有所不同。

客户端元素
客户端元素是页面上的非 Web 服务器控件元素,它们将按原样被传递给浏览器。因此,从客户端元素中引用资源时,应根据 HTML 中 URL 的标准规则构造路径。可以使用完全限定的 URL 路径(又称为绝对 URL 路径),也可以使用各种类型的相对路径。例如,如果页面包含 img 元素,则可以使用以下路径之一设置其 src 属性:
绝对 URL 路径。如果引用其他位置(例如外部网站)中的资源,则绝对 URL 路径非常有用。

<img src="http://www.contoso.com/MyApplication/Images/SampleImage.jpg" />网站根目录相对路径,此路径将根据网站根目录(而非应用程序根目录)进行解析。如果将跨应用程序的资源(例如图像或客户端脚本文件)保留在网站根目录下的文件夹中,则网站根目录相对路径非常有用。

此示例路径假定 Images 文件夹位于网站根目录下。

<img src="/Images/SampleImage.jpg" />如果您的网站为 http://www.contoso.com,则此路径将解析为以下形式。

http://www.contoso.com/Images/SampleImage.jpg下面是一个根据当前页面路径解析的相对路径。

<img src="Images/SampleImage.jpg" />解析为当前页面路径对等的相对路径。

<img src="../Images/SampleImage.jpg" />注意
默认情况下,浏览器使用当前页面的 URL 作为解析相对路径的基准。但是,您可以在页面中包含 HTML base 元素,以指定替代基路径。

服务器控件
在引用资源的 ASP.NET 服务器控件中,可以使用绝对路径或相对路径,这一点与客户端元素一样。如果使用相对路径,则相对于页面、用户控件或包含该控件的主题的路径进行解析。例如,假设 Controls 文件夹中包含一个用户控件。该用户控件包含一个 Image Web 服务器控件,此服务器控件的 ImageUrl 属性被设置为以下路径:Images/SampleImage.jpg。
当该用户控件运行时,上述路径将解析为以下形式:/Controls/Images/SampleImage.jpg。无论承载该用户控件的页面位于何处,结果都是如此。

注意

在主控页中,资源的路径基于内容页的路径进行解析。有关更多信息,请参见 ASP.NET 母版页概述。

服务器控件中的绝对和相对路径引用具有以下缺点:
绝对路径在应用程序之间是不可移植的。如果移动绝对路径指向的应用程序,则链接将会中断。
如果将资源或页面移动到不同的文件夹,可能很难维护采用客户端元素样式的相对路径。
为克服这些缺点,ASP.NET 包括了 Web 应用程序根目录运算符 (~),当您在服务器控件中指定路径时可以使用该运算符。ASP.NET 会将 ~ 运算符解析为当前应用程序的根目录。可以结合使用 ~ 运算符和文件夹来指定基于当前根目录的路径。
下面的示例演示了使用 Image 服务器控件时用于为图像指定根目录相对路径的 ~ 运算符。在此示例中,无论页面位于网站中的什么位置,都将从位于 Web 应用程序根目录下的 Images 文件夹中直接读取图像文件。
<asp:image runat="server" id="Image1"
ImageUrl="~/Images/SampleImage.jpg" />可以在服务器控件中的任何与路径有关的属性中使用 ~ 运算符。~ 运算符只能为服务器控件识别,并且位于服务器代码中。不能将 ~ 运算符用于客户端元素。

注意
仅限于移动页,如果您的应用程序依赖于无 Cookie 会话或者可能收到来自移动设备的需要无 Cookie 会话的请求,则在路径中使用波形符(“~”)会导致意外创建新会话,并可能丢失会话数据。若要使用包含波形符(例如“~/路径”)的路径来设置移动控件的属性,请先使用 ResolveUrl 方法解析该路径,再将其分配给该属性。
确定当前网站的物理文件路径

在应用程序中,您可能需要确定服务器上的文件或其他资源的路径。例如,如果应用程序以编程方式对文本文件进行读写操作,则必须为用于读取和写入的方法提供该文件的完整物理路径。
将物理文件路径(例如 C:\Website\MyApplication)硬编码到应用程序中并不是很好的做法,因为如果移动或部署应用程序,将会更改这些路径。但是,ASP.NET 为您提供了以编程方式获取应用程序中的任何物理文件路径的方法。然后,您可以使用基文件路径创建所需资源的完整路径。用于确定文件路径的两种最常用的 ASP.NET 功能是返回路径信息的 HttpRequest 对象的属性,以及 MapPath 方法。

注意
不应将物理文件路径发送到客户端,因为它们可能会被恶意用户用来获取有关您的应用程序的信息。
根据请求属性确定路径
下表列出了 HttpRequest 对象的属性,这些属性帮助您确定应用程序中的资源的路径。
表中列出的示例基于下面的假设:
已使用以下 URL 发出浏览器请求:http://www.contoso.com/MyApplication/MyPages/Default.aspx
术语“虚拟路径”是指请求 URL 中跟在服务器标识符后面的部分;在此示例中,虚拟路径是指以下路径:/MyApplication/MyPages/Default.aspx。
网站根目录的物理路径为:C:\inetpub\wwwroot\MyApplication\。
该物理路径中包含一个名为 MyPages 的文件夹。

属性 说明
ApplicationPath
获取当前应用程序的根目录路径,无论在该应用程序中的什么位置请求该路径。在此示例中,该属性将返回以下内容:/

CurrentExecutionFilePath
获取当前请求的虚拟路径。它与 FilePath 属性的不同之处在于,如果请求已在服务器代码中被重定向,则 CurrentExecutionFilePath 就是正确的。在此示例中,该属性将返回以下内容:/MyApplication/MyPages/Default.aspx
如果作为对 Transfer 或 Execute 进行调用的结果,您获取正在运行的代码中的属性,则路径将反映该代码的位置。

FilePath
获取当前请求的虚拟路径。在此示例中,该属性将返回以下内容:/MyApplication/MyPages/Default.aspx
与 CurrentExecutionFilePath 属性不同的是,FilePath 不反映服务器端的传输。

Path
获取当前请求的虚拟路径。在此示例中,该属性将返回以下内容:/MyApplication/MyPages/default.aspx

PhysicalApplicationPath
获取当前正在执行的应用程序的根目录的物理文件系统路径。在此示例中,该属性将返回以下内容:C:\inetpub\wwwroot\

PhysicalPath
获取与请求的 URL 相对应的物理文件系统路径。在此示例中,该属性将返回以下内容:C:\inetpub\wwwroot\MyApplication\MyPages\default.aspx

使用 MapPath 方法
MapPath 方法返回传递给该方法的虚拟路径的完整物理路径。例如,以下代码返回网站根目录的文件路径:
Visual Basic
Dim rootPath As String = Server.MapPath("~")
C#
String rootPath = Server.MapPath("~");

注意
传递给 MapPath 方法的路径必须为应用程序相对路径,而不是绝对路径。
Control.ResolveUrl 方法 [C#]请参见
Control 类 | Control 成员 | System.Web.UI 命名空间 | TemplateSourceDirectory | Control 成员(Visual J# 语法) | C++ 托管扩展编程
要求
平台: Windows 2000, Windows XP Professional, Windows Server 2003 系列

语言
C#
C++
JScript
Visual Basic
全部显示
将 URL 转换为在请求客户端可用的 URL。

[Visual Basic]
Public Function ResolveUrl( _
ByVal relativeUrl As String _
) As String

[C#]
public string ResolveUrl(
string relativeUrl
);

[C++]
public: String* ResolveUrl(
String* relativeUrl
);

[JScript]
public function ResolveUrl(
relativeUrl : String
) : String;

参数
relativeUrl
与 TemplateSourceDirectory 属性相关联的 URL。
返回值
转换后的 URL。