asp.net 中的相对路径

闭包客 2016-12-16 06:02:57
前几天看到一个怎么在 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 文件中。
...全文
5290 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_14965821 2017-01-09
  • 打赏
  • 举报
回复
学习了 感谢大家
joyhen 2016-12-26
  • 打赏
  • 举报
回复
引用 30 楼 closurer 的回复:
[quote=引用 29 楼 jjkk168 的回复:] [quote=引用 14 楼 Joyhen 的回复:] /打头的指向根目录,往后一层层下去,千万不要用所谓的相对路径,不利于拆分、迁移、分布式。 ../..... ~/ 这种就别用了
你放到应用程序或虚拟目录里面试试?你这种观念本来就是错误的[/quote] 放到应用程序或虚拟目录里这种做法,一般出现在企业内部应用中,的确不太适用这种写法。 面向外网的项目极少放到虚拟目录。 [/quote]静态资源文件都是配单独静态站,以/打头,前面是个动态地址统一配,切换好好切。虚拟目录一样,使用的时候将地址改成虚拟目录的真实地址前缀即可。另外,非常不建议在IIS里面配虚拟目录,1是攻击者容易回溯路径,2是你的站没啥并发要求
闭包客 2016-12-26
  • 打赏
  • 举报
回复
引用 29 楼 jjkk168 的回复:
[quote=引用 14 楼 Joyhen 的回复:] /打头的指向根目录,往后一层层下去,千万不要用所谓的相对路径,不利于拆分、迁移、分布式。 ../..... ~/ 这种就别用了
你放到应用程序或虚拟目录里面试试?你这种观念本来就是错误的[/quote] 放到应用程序或虚拟目录里这种做法,一般出现在企业内部应用中,的确不太适用这种写法。 面向外网的项目极少放到虚拟目录。
还想懒够 2016-12-22
  • 打赏
  • 举报
回复
引用 14 楼 Joyhen 的回复:
/打头的指向根目录,往后一层层下去,千万不要用所谓的相对路径,不利于拆分、迁移、分布式。 ../..... ~/ 这种就别用了
你放到应用程序或虚拟目录里面试试?你这种观念本来就是错误的
电饭锅煲汤 2016-12-20
  • 打赏
  • 举报
回复
学习了~~~
symboled 2016-12-19
  • 打赏
  • 举报
回复
楼主威武!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
闭包客 2016-12-19
  • 打赏
  • 举报
回复
从大家的回复中,增进了我对 asp.net 的 【~/】 这种表达方式的了解。 就是表示从项目的根目录开始,由服务器解析成【../】的方式。 MVC 也有其生成路径的方式。 我相信这些方法对于 asp.net 程序员来说,是没有障碍的。 问题是要给前端的程序员一个 <%=ServerPath %> 这样的值,告诉客户端现在的项目地址。 很多前端程序员并不乐意这样做,觉得一旦有服务器端的耦合之后,就不是自己的工作了。 我很感谢那些愿意直接在 Visual Studio 里面修改文件的前端,真的是帮了大忙!其实 Visual Studio 也有意设计成让前端人员也可以使用的,但是实际上并没有得到大多数的接纳。
正怒月神 版主 2016-12-19
  • 打赏
  • 举报
回复
支持一下。
弘毅致远 2016-12-19
  • 打赏
  • 举报
回复
Url.Content,不直接用/的方式。
yzf86211861 2016-12-19
  • 打赏
  • 举报
回复
6666666666666666666666666666666666
  • 打赏
  • 举报
回复
还可以在head中加上<base href="<%=ServerPath %>"> 然后文档中所有的相对地址都会自动以它为基地址,绝对路径不受影响,有利有弊
joyhen 2016-12-18
  • 打赏
  • 举报
回复
/打头的指向根目录,往后一层层下去,千万不要用所谓的相对路径,不利于拆分、迁移、分布式。 ../..... ~/ 这种就别用了
lshfong 2016-12-18
  • 打赏
  • 举报
回复
如果用MVC的话 一是磁盘根目录 二是APP根目录
EnForGrass 2016-12-18
  • 打赏
  • 举报
回复
带.的写法看起来太差了,一般借助NET自带的方法去写路径,如Server.MapPath(), MVC有Url.Content()方法:将虚拟(相对)路径转换为应用程序绝对路径
symboled 2016-12-17
  • 打赏
  • 举报
回复
学习了,楼主辛苦
笑容融化坚冰 2016-12-17
  • 打赏
  • 举报
回复
还有一点,mvc项目你写文件路径,千万要调用url.content方法获取路径,养成习惯。 即使你的项目是挂载在某站点子目录下,这函数也能生成正确路径
suolande 2016-12-17
  • 打赏
  • 举报
回复
看看,学习一下。
  • 打赏
  • 举报
回复
前端工程师的技术也需要重构、学习。所介绍的几种思路,如果只是初学前端的人最初刚学前端编程时理解的写法,那是不行的。
  • 打赏
  • 举报
回复
在 asp.net 中正规的路径写法是类似 ~/dir/file.aspx ~/js/common.js 这类写法,既不是绝对路径也不是相对路径。 那么对于纯粹的“前端”代码,不是说就傻傻地束手无策了(以为只能写成绝对路径或者相对路径),而是要在 javascript 代码中写 ServerPath + "/dir /file.aspx" 这样的路径才对。
  • 打赏
  • 举报
回复
如果是纯粹的“前端”,它可以定义一个全局变量(例如叫做 ServerPath)的来表示网站部署地址,然后程序中涉及到访问服务器的 url 的时候将它与请求的后半部分相拼接。而这个变量值完全可以由 web 服务程序来设置。 而不是只写“/”开头的地址。
加载更多回复(3)

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧