转载于https://bbs.csdn.net/topics/392065120
前几天看到一个怎么在 asp.net 中写网页路径的问题,在这里多说几句。
在 web form 的编程中,一个完整的 url 是一般是这样的:
http://bbs.csdn.net/dir/file.aspx
程序员在编写指向 file.aspx 这个页面的代码的时候,往往不知道项目会部署到什么域名中,又或者测试的时候所使用域名与正式环境所使用域名不相同。在 IIS 中,还有在一个网站中创建应用的做法,更有多个域名指向同一个网站的情况……
可能在网页部署的时候,是这样的:
http://www.csdn.net/dir/file.aspx
http://geek.csdn.net/dir/file.aspx
http://www.csdn.net/app1/dir/file.aspx
这样,如果使用完整的 url(绝对链接),部署的域名不同或端口不同或应用不同,你都要修改你的代码中的 url
为了避免这样的情况,那么就要使用相对链接,前端工程师编写的 html 文件,会这样写:
/dir/file.aspx
(这是相对于域名的链接,与代码本身的目录位置无关。)
如果指向 file.aspx 的代码在同一个目录下,也可以:
file.aspx
如果在上一层目录中:
dir/file.aspx
如果在下一层目录中:
../file.aspx
如果在下一层目录的下一层目录中:
../../file.aspx
(以上四种是相对于代码目录位置的链接,代码目录位置变动之后,就不再准确。)
asp.net 还支持一种相对链接写法:
~/dir/file.aspx
这种写法只能写在支持它的服务器端控件中,根据代码的目录位置,经过程序处理,它生成到客户端的链接可能是:
file.aspx
../file.aspx
../../file.aspx
也就是说,它会被生成浏览器能够识别的链接,这种写法是不能直接被浏览器识别的,必须通过 asp.net 程序的处理。
这种方法使得程序员在深层次目录指向浅目录时,可以少写几个点(.)
据说更重要的是,它能兼容 IIS 中在网站下面创建应用的情况,也就是即使项目部署到 http://www.csdn.net/app1 ,这种写法不用修改,而相对于域名的链接 /dir/file.aspx ,则会指向错误,但相对于代码目录位置的写法 ../file.aspx 是不受影响的。
我不知道这种写法在 asp.net mvc 中会发生什么情况,它自带的路由功能,使得代码的目录位置与实际访问的位置已经没有关联。其实在 mvc 以前,你使用了 url 重写同样如此。
我比较喜欢 /dir/file.aspx 这种相对于域名的写法。
因为访问路径其实比较容易确定,一旦网站部署,改动并不会太频繁,因为它可能被用户收藏,也可能被搜索引擎抓取了。
相对于访问路径,改动得更频繁的,可能是代码的目录位置。现在的 web 编程,javascript 代码、异步请求越来越多,一个 url 可以被选择写在多个目录位置中。可能是被前端工程师写在 html 文件、js 文件中,也可能被后端程序员写在 aspx、cshtml、cs 文件中。
在 asp.net 中正规的路径写法是类似
~/dir/file.aspx
~/js/common.js
这类写法,既不是绝对路径也不是相对路径。
那么对于纯粹的“前端”代码,不是说就傻傻地束手无策了(以为只能写成绝对路径或者相对路径),而是要在 javascript 代码中写
ServerPath + "/dir /file.aspx"
这样的路径才对。
事实上~/dir/file.aspx不止在服务器端软件生效,在其他非服务器端软件(如 <img>、<a>)web应该程序也会转换成正确的路径
~/dir/file.aspx与 /dir/file.aspx的区别:
/dir/file.aspx表示从网站根目录开始寻找, ~/dir/file.aspx表示从当前应用程序根目录开始寻找
比如在MVCTest网站下面添加了一个应用程序yt,那么~/Content/Image/cat.jpg生成的路径是/yt/Content/Image/cat.jpg
而/Content/Image/cat.jpg 生成的路径是/Content/Image/cat.jpg是在 mvctest下面寻找而不是在yt下面寻找
<img src="~/Content/Image/cat.jpg" alt="" />
<img src="/Content/Image/cat.jpg" alt="" />