ASP.NET 网站路径
9 J, j: |" x7 H$ y2 l7 F; y
; O5 n. n7 F. p# H+ h+ X, V( J9 M
ASP.NET 网站路径
3 ~0 |, z3 O: B! e5 F. |9 X* h* i
$ h* A4 I# x; H2 m$ G
2 {" f2 O" T6 c1 G使用网站中的资源时,通常必须指定资源的路径。例如,您可以使用 URL 路径引用页面中的图像文件或网站中其他位置处的页面的 URL。同样,Web 应用程序中的代码可以使用基于服务器的文件的物理文件路径对文件进行读写操作。ASP.NET 提供用于引用资源并确定应用程序中的页面或其他资源的路径的方法。
) Q7 g, J; n, D( ]/ P" e
$ O' w ~! p* E8 G指定资源的路径
7 U% U. Y- s+ g4 `0 I许多情况下,页面中的元素或控件必须引用外部资源,如文件。ASP.NET 允许您通过各种方法引用外部资源。所选方法取决于使用客户端元素还是服务器控件。
5 c. p( M! G1 [2 H3 Q: L% l9 M; L' u6 Y4 g8 I" V/ |8 D& A
客户端元素
3 d( A0 n+ o" Z j( r" w3 \# B元素(不是页面中的服务器控件,而是客户端元素)以原样传递给浏览器。因此,从客户端元素中引用资源时,应根据 HTML 中 URL 的标准规则构造路径。可以使用完全限定(绝对)URL 路径,也可以使用各种类型的相对路径。例如,如果页面包含一个 img 标记,则可以使用以下路径之一设置其 src 属性:
! |- N/ y) P6 c$ i, _1 r7 T+ o
绝对 URL 路径:
! t0 g* X8 t7 p0 S4 {6 x9 A* P
8 U0 v5 o/ X( a1 J: W复制代码
1 z5 N! C3 d, L7 W" _<img src="http://www.contoso.com/MyApplication/Images/SampleImage.jpg" />
( Z4 n1 q/ [" d/ S" e) `) u7 d' B: |' A y0 q% E1 C: W
0 U$ J" y8 v& H8 p z+ W* r
如果引用其他位置(如外部网站)中的资源,则绝对 URL 路径非常有用。
X1 O6 k+ u4 }9 ]. j! `2 u* `
( v, l3 ^4 p% x0 f, r5 a' L
站点根目录相对路径,根据站点(不是应用程序)根目录进行解析。此示例路径假定 Images 文件夹存在于网站根目录下:
' x9 ]+ S6 p! Y* V- k _4 o
1 V# _5 E4 f# D) _[注:站点的根路径例:http://localhost:8080/ 应用根路径:http://localhost:8080/webapplication/ 在一个网站根路径下可能有多个应用。]# j% w+ |/ L0 n' U4 s3 W0 A1 ]
5 h, v6 q: F5 w) ^. _$ F2 w
复制代码
/ w) P$ }+ g* \; C7 r9 |2 o& q' v1 L
<img src="/Images/SampleImage.jpg" />
8 p' K$ o% ?) T P+ I# V$ f+ K. o0 e% V9 P4 Q# ^
; H. e7 g6 f; ]8 R/ K8 c
如果您的网站为
http://www.contoso.com,则路径将解析为以下形式:
. I0 t& @, k! R
! Y' v) Q- S. d' |复制代码
7 R W: z* g$ M; l" C9 L
; j9 d2 k8 M+ S) y# d# r
& x% n: |5 v5 b/ P" u. _
# c7 o5 y& k: d; c+ P如果将跨应用程序的资源(如图像或客户端脚本文件)保留在网站根目录下的文件夹中,则站点根目录相对路径非常有用。
% {! s- F3 {$ {/ B+ W. m9 l
+ Q% b2 q, h" G' K% z根据当前页面路径解析的相对路径:
; M, b3 C2 w& s; t8 W( V7 n
9 c) r, y. _8 y+ Y% g% J
复制代码
2 J7 u; ^$ U( `4 _ L, j. n
<img src="Images/SampleImage.jpg" />
3 k0 `+ c6 Y( r+ G. i0 C0 o* ^5 s- S) N$ c" y
- D9 E# k. ]( A1 I; Z- b
解析为当前页面路径对等的相对路径。
" X; E& b3 J! Y, Y& V. [7 h( E
3 Y7 R1 {5 @$ ^) j( J! |复制代码
' e0 ~6 ~: j1 t; \1 n<img src="../Images/SampleImage.jpg" />
+ q8 z. T6 N5 b. p6 x! _. P, |5 f& `6 c; e- B, t
注意
: |$ c/ x% \3 o+ j默认情况下,浏览器使用当前页面的 URL 作为基准解析相对路径。但是,您可以在页面中包含 HTML base 元素,以指定替代基路径。
# S0 l! l) C0 n, F- H/ Z- q2 U
" _; K6 y! {8 D' g- Y7 f' P
" e+ q/ k2 V4 L: g6 f' g服务器控件
; m1 _4 k$ J2 B3 s7 |在引用资源的 ASP.NET 服务器控件中,可以使用绝对路径或相对路径,这一点与客户端元素一样。如果使用相对路径,则相对于页面、用户控件或包含该控件的主题的路径进行解析。例如,假设 Controls 文件夹中包含一个用户控件。该用户控件包含一个 Image Web 服务器控件,该服务器控件的 ImageUrl 属性设置为以下路径:
5 F" `0 _& ^; i
& G+ Y, o! p4 ^: x' f% K% U4 g0 v7 M! {Images/SampleImage.jpg
' M" C0 |' i1 B/ M, ^7 T6 \* V
* A4 j( p; O+ k( F& [0 o# c$ f6 H8 L该用户控件运行时,路径将解析为以下形式:
% t- D2 M0 ?1 y7 e1 Y
7 H& d, _5 g! X' E+ R/Controls/Images/SampleImage.jpg
/ |* f y& t% k7 ?6 {4 a8 y/ A0 s/ r% q; o# g" R; h- e
无论承载用户控件的页面位置如何,都是如此。
+ N' L, w; g0 v; L
+ i" N; k/ l: J+ k) q服务器控件中的绝对和相对路径引用具有以下缺点:
5 O1 z" J, G; D6 C; I
8 w: |; a& I# ^- t) q( B
绝对路径在应用程序之间是不可移植的。如果移动绝对路径指向的应用程序,则链接将会中断。
7 n( ?" g4 V# n+ I
0 k" N x; e& Z如果将资源或页面移动到不同的文件夹,可能很难维护采用客户端元素样式的相对路径。
# \9 w. c5 [; ~) W. R4 A7 K% [% j0 Z& I; E
为克服这些缺点,ASP.NET 启用了 Web 应用程序根目录运算符 (~),在服务器控件中指定路径时,可以使用该运算符。ASP.NET 会将 ~ 运算符解析为当前应用程序的根目录。可以结合使用 ~ 运算符和文件夹来指定基于当前根目录的路径。下面的示例演示使用 Image 服务器控件时用于指定图像的根目录相对路径的 ~ 运算符:
9 I* L8 l3 E+ S; h6 o/ ^$ \+ v* ~0 G
复制代码
* m, ~* z- v; h0 Y) W( o4 b" i8 t" n
<asp:image runat="server" id="Image1"
8 F. p6 g2 g: i6 J$ NImageUrl="~/Images/SampleImage.jpg" />
6 `& l( {( O( z) Z+ d
9 j) k! e/ b1 u
" A. n8 m: F H9 h8 n2 w" U; R6 q. y- h
在该示例中,图像文件将从 Web 应用程序根目录下的 Images 文件夹中直接读取,无论该页面位于网站的什么位置。
; @# C* P. q: h; D$ p/ K- T
( G% Y- @! n9 J
注意
5 a# F D& @3 S8 D~ 运算符只能为服务器控件识别,并且位于服务器代码中。不能将 ~ 运算符用于客户端元素。
/ G2 j8 a6 l4 N2 S[注:所以这是asp.net中特有的东西。也就是说只有在打上runat="server"的标记的属性里面才可以用到,由服务器来解析。]
& |7 w! P0 [- x! u$ v) t0 F4 k8 @3 B/ |" k5 T3 w
& t5 m2 t4 p6 `3 H; v9 m可以在服务器控件中的任何与路径有关的属性中使用 ~ 运算符。
# t6 U- W _( y" y" x6 P2 g# {# M
2 H+ H" V8 N$ `' G. Z" F( f注意
" H8 h- b2 M) ^/ k' d9 V
在主控页中,资源的路径基于内容页的路径进行解析。有关更多信息,请参见 ASP.NET 主控页概述。
! k! f2 I, [. ]* y' \
& ]7 c4 h# U2 `! m/ C* K5 t+ W0 j/ @" t# f I2 Y9 w
确定当前网站的物理文件路径
: L7 u0 B- } v; I
在应用程序中,您可能需要确定服务器上的文件或其他资源的路径。例如,如果应用程序以编程方式对文本文件进行读写操作,则必须为用于读取和写入的方法提供该文件的完整物理路径。
) w3 g5 x K q- [: w |
# R q% L# A0 L6 s! T" P: V将物理文件路径(如 C:\Website\MyApplication)硬编码到应用程序中并不是很好的做法,因为如果移动或部署应用程序,则路径会发生更改。但是,ASP.NET 为您提供了以编程方式获取应用程序中的任何物理文件路径的方法。然后,您可以使用基文件路径创建所需资源的完整路径。用于确定文件路径的两种最常用的 ASP.NET 功能是返回路径信息的 HttpRequest 对象的属性,以及 MapPath 方法。
8 Q# a) c3 ]) p" G+ t0 q V1 W
0 {- Y! e3 I1 S& R$ @/ h8 ]注意
0 \1 l" i' F- @" H8 ^: u- e0 B不应将物理文件路径发送到客户端,因为它们可能会被恶意用户用来获取有关您的应用程序的信息。
& L: |5 x/ L# \* s
) m1 b8 ~" @" M' c$ |- c: R* I. c
根据请求属性确定路径
U# D# H* z* J1 F. N8 z$ ]7 Y
下表列出了 HttpRequest 对象的属性,这些属性帮助您确定应用程序中的资源的路径。
9 q" a: H! l" S" O0 a% y6 N+ U) d0 L! f) g) d- k" h( k# i! }
下面的示例假定使用以下 URL 来发出浏览器请求:
" H8 e+ d1 o- @. h, f, A8 Z
# m8 C4 a; T1 |8 r$ A' K; t
复制代码
0 G" T; a$ W$ o$ Z9 ^http://www.contoso.com/MyApplication/MyPages/Default.aspx8 h* x$ L1 a5 g* K! e' K1 i
9 @( Z' Z/ \: q7 Z x# q. k
5 V% Y: r* m4 `! h% O对于这些示例,术语“虚拟路径”是指跟在服务器标识符后面的请求 URL 的一部分,此时虚拟路径如下所示:
% ?, z7 V* j7 T. P9 R7 t* h& Y5 e' m! {3 p; X, a' {- ?
复制代码
+ |2 Y* A& f/ }! {' M
/MyApplication/MyPages/Default.aspx
- t0 G3 P; b7 ~. z* f3 a# \, P* Q. m2 H$ s9 M
+ p) |0 a4 `! j8 a( y此外,这些示例假定网站根目录的物理路径为以下形式:
$ o( I$ _0 p7 U
% W/ d1 H' J0 G, p- C( ~: i
复制代码
2 Y" Z- }: S# g$ @# y
C:\inetpub\wwwroot\MyApplication\
, O5 W0 H `1 t- B1 ?1 s. s( g
+ r( S7 A6 u6 v" U, b4 F: }" f* s
0 y$ Q+ `) }" Q: g最后,这些示例假定物理路径包含一个名为 MyPages 的文件夹。
& m# U& H3 C# t7 M0 r: V1 E: S G4 O" `2 j* d$ g# g, o
属性 说明
% z0 }: j. J6 l3 u/ _; }
ApplicationPath
; I8 t+ J' w P8 m, ^ k0 t; j
获取当前应用程序的根目录路径,无论在该应用程序中的什么位置请求该路径。对于此示例,该属性将返回以下内容:
0 b! c) z9 `1 ^) v7 Q) \2 p
2 F% K0 Z* Z2 ^9 \' ?
/
* m" k' a0 \6 P. e
1 v0 `) b# B" M. G3 u: ECurrentExecutionFilePath
6 d3 m4 c7 G0 F- k# h获取当前请求的虚拟路径。不同于 FilePath,差别在于如果请求已在服务器代码中被重定向,则 CurrentExecutionFilePath 就是正确的。对于此示例,该属性将返回以下内容:
! P4 i/ D9 J, u2 A5 G. b
' ]3 w) C5 ?6 |# t/MyApplication/MyPages/Default.aspx
. y( q( N$ c- J* l3 E
/ u) `6 Y* k! F, i5 W; s7 p如果作为对 Transfer 或 Execute 进行调用的结果,您获取正在运行的代码中的属性,则路径将反映该代码的位置。
6 }" Q; c% ~9 y. N! v9 H/ M1 {/ f% j
FilePath
: }# {0 G* o7 T- l( N, _! O8 y) K6 _获取当前请求的虚拟路径。对于此示例,该属性将返回以下内容:
/ ^( Q( u, C0 i: J' e; a
; n" E3 R1 y. F ~/MyApplication/MyPages/Default.aspx
" ?* t* Q- @6 y! o( O! M- I3 P5 L% ]7 ^7 J" b7 k. I/ a
不同于 CurrentExecutionFilePath,FilePath 不反映服务器端转换。
) O3 d6 Z2 f: L, b, E! w) F5 e( O1 k
Path
* q+ ?) y+ u0 [/ i& n+ {8 [
获取当前请求的虚拟路径。对于此示例,该属性将返回以下内容:
9 ^6 ^, y/ P' g- ]8 C& n1 r' A
2 R9 T8 y* \" K( I! N M/MyApplication/MyPages/default.aspx
7 [0 F" f7 E+ U: i0 Y: o: X& X, e+ W: x( X( w# ~
PhysicalApplicationPath
' ~' J1 t0 N/ D% `9 k o) r$ t获取当前正在执行的应用程序的根目录的物理文件系统路径。对于此示例,该属性将返回以下内容:
3 B+ {8 j5 `' g& Z, f
2 o. M) D0 X' `: Z iC:\inetpub\wwwroot\
8 \6 u6 B: E6 ]: i- I
+ u8 ]1 `; r+ tPhysicalPath
, g3 Z6 f" z* w0 {( j2 {5 O5 h# ?
获取与请求的 URL 对应的物理文件系统路径。对于此示例,该属性将返回以下内容:
! g: A$ Q1 d) x5 d2 x& g
( g0 y7 h( u* {; ], b X6 N3 y
C:\inetpub\wwwroot\MyApplication\MyPages\default.aspx
4 ]0 _9 H& }+ {' T5 J' a5 n1 ~6 H; @4 d8 L) o. b/ ~
: l3 V% [% L9 |, O
使用 MapPath 方法
. J8 `! M( ] L4 I$ Y1 W# EMapPath 方法返回传递给该方法的虚拟路径的完整物理路径。例如,以下代码返回网站根目录的文件路径:
+ H4 o% e7 d0 ?- X
* W2 I) X! S. @3 Y0 ~/ }/ \7 UVisual Basic 复制代码
$ b: _% _" ?- S9 I; bDim rootPath As String = Server.MapPath("~")
a$ |) U6 _/ z; j" c2 {9 s: [' @, B
C# 复制代码
, a: C7 f- j, ZString rootPath = Server.MapPath("~");
! R# {; G; N! m* g
7 N( e: _! T0 C" N/ m注意
3 K2 Z6 h" j6 G' G. X& q$ |9 F传递给 MapPath 方法的路径必须为应用程序相对路径,而不是绝对路径。
2 \: \% g$ ~& ~ `' L; v
5 Y7 V5 ~, c% ]+ y e! X
6 R4 b0 D$ E' m' y# |( o$ T
请参见
& Z) E! j3 k9 t+ [4 F5 b* D# d" t
概念
1 a0 W, l+ x. vASP.NET 网站布局
1 r! x% |( i- s% a c( R+ Q' {! l
ASP.NET Web 应用程序中的页和应用程序上下文