ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

使用网站资源时,需要经常使用资源路径。比如,在页面中使用 URL 引用不同路径中的图片文件。类似地,Web 应用代码也可能使用物理文件路径来读写服务器端的文件。ASP.NET 提供不同的方法来引用资源并确定页面或其他资源的路径。

指定资源路径

ASP.NET 允许开发者通过多种方式引用页面元素或控件的外部资源文件。选择方式区别于客户端元素或服务器控件的类型。

客户端元素

页面中非服务器控件直接发送给浏览器。在此前,需要依照标准 HTML URL 规则构造用于客户端元素的资源引用路径。也可以使用完整(绝对)URL 路径或别的相关路径。比如 img 标记,可以将 src 属性设置成以下任何一种形式:

  • 绝对 URL 路径:

    <img src="http://www.contoso.com/MyApplication/Images/SampleImage.jpg" />
    

    绝对 URL 路径适用于引用对其他网站的资源。

  • 根目录相对路径针对网站(非应用程序)根目录进行解析。下例假设网站根目录存在 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 目录有一个用户控件,包含 ImageUrl 属性被设置成如下路径的 Image Web 控件:

Images/SampleImage.jpg

用户控件运行时,路径被解析成如下所示:

/Controls/Images/SampleImage.jpg

不用考虑使用该用户控件的页面路径。

在服务器控件中引用绝对路径或相对路径有下列缺点:

  • 绝对路径无法在应用程序间移植。有造成所有链接中断的隐患。

  • 客户端元素的相对路径在资源或页面移动时加大维护难度。

为了克服这些缺点,ASP.NET 使用了新 Web 根目录符号(~),用于设置服务器控件的路径。ASP.NET 将符号 ~ 解析成当前应用程序的根目录。可以用符号 ~ 与目录一道来指定基于当前根目录的路径。下例使用了符号 ~ 为服务器控件 Image 指定相对路径。

<asp:image runat="server" id="Image1" ImageUrl="~/Images/SampleImage.jpg" />

上例中的图片文件将会从网站根目录下的 Images 目录中读取,且当前页面可以放在网站的任何位置。

说明:符号 ~ 仅适用于服务器端代码的服务器控件。不能在客户端元素中使用。

服务器控件中任何与路径有关的属性都可使用符号 ~。

注意:在模板页中,对资源路径的解析是基于内容页面的。

确定当前网站的物理路径

应用程序中,可能需要确定服务器文件或资源的路径。比如,当应用程序要对一个文本文件进行读写,就需要为读取和写入功能提供目标文件的物理路径。

在应用程序中使用硬编码的物理路径(如 C:\Webste\MyApplication)并不是一个好的习惯,且路径会随着文件的移动或布署而发生变化。这时候可以通过基点参考的方法来为资源创建完整路径。ASP.NET 中常用来确定文件路径有两个方法:HttpRequest 对象属性,以及 MapPath 方法。

注意:为防止恶意用户获取应用程序的机密信息,请不要将物理文件路径发送到客户端。

Request 对象的属性中确定路径

下表是 HttpRequest 对象的属性列表,可用来确定应用程序中的资源路径。

首先,假设用浏览器发送如下请求:

http://www.contoso.com/MyApplication/MyPages/Default.aspx

在本文的例子中,对“虚拟路径”的参考都将服务器标识作为 URI 的一部分;而本例中的虚拟路径则是这样:

/MyApplication/MyPages/Default.aspx

另外,还假设网站根目录的物理路径如下:

C:\inetpub\wwwroot\MyApplication\

最后,还假设物理路径中包含子目录 MyPages。

属性描述

ApplicationPath

获取当前应用程序根目录,无需考虑请求发生的位置。本例中的返回值如下:

/

CurrentExecutionFilePath

获取当前请求的虚拟目录。与 FilePath 不同是请求被代码重定向时 CurrentExecutionFilePath 属性仍然返回正常值。本例中的返回值如下:

/MyApplication/MyPages/Default.aspx

如果在代码中作为 TransferExecute 的执行结果而获取该参数,参数中会反射代码文件的路径。

FilePath

获取当前请求的虚拟路径。本例中的返回值如下:

/MyApplication/MyPages/Default.aspx

CurrentExecutionFilePath 不同,FilePath 不反射服务器端的传送(调用 Transfer 方法)信息。

Path

获取当前请求的虚拟路径。本例中的返回值如下:

/MyApplication/MyPages/default.aspx

PhysicalApplicationPath

获取当前执行的应用程序根目录的物理路径。本例中的返回值如下:

C:\inetpub\wwwroot\

PhysicalPath

获取当前 URI 请求对应的物理系统文件路径。本例中的返回值如下:

C:\inetpub\wwwroot\MyApplication\MyPages\default.aspx
使用 MapPath 方法

MapPath 方法以参数的方式接收虚拟路径,并返回对应的物理路径。在本例中,下面的代码返回网站根目录文件的物理路径:

String rootPath = Server.MapPath("~");

注意:传递给 MapPath 方法的路径必须是相对路径,不能使用绝对路径。

posted on 2006-12-05 17:07  Laeb  阅读(3640)  评论(0编辑  收藏  举报