asp.net webform中的相对地址和绝对地址

    先看一下什么是相对地址和绝对地址,举个例子:我想去某个地方,有两种方法可以知道地方所在地,第一种:这个地方所在的绝对地址,比如在浙江省杭州市西湖区某某小区多少号等,这个确切的地址称为绝对地址,对于计算机来说就是文件所在的具体路径,具体到哪个盘符下哪个文件夹下的某个文件;相对地址主要看相对于谁?比如想到A地方,相对于现在在的位置D,要经过B地、C地才能到达A地,它不是一个确切的地址,但是通过比对(相对的对象,一般指的是网站根目录)可以找到该位置,称为相对地址。

    在一个网站中,要读取文件、下载附件、上传文件、网站页面显示图片等都需要指定附件所在的位置,一般用的是相对地址(相对于网站的根目录),这是因为网站不确定要部署在计算机的什么位置。若都写成绝对的地址,当网站需要部署到用户环境下时就需要相应的调整这些附件的地址。

    mvc中url地址的输出是根据当前制定的路由机制来处理的,路由做了两件事;当在地址栏输入一个请求地址时,怎么把它映射到控制器中的具体某个方法中,即怎么把地址转化成控制器对应的视图下的文件的地址;输出url,mvc框架封装了不少辅助器方法用以拿到地址比如:Html.ActionLink()、Url.Content()、Html.RouteLink()、Url.RouteUrl()、Redirect()方法等,使用这些方法会根据当前路由机制生成可访问的地址。mvc框架在查找视图文件时会默认先从Share下开始查找,找不到时到控制器对应的视图文件下找,再找不到报错404。

    webform中默认是从当前页面开始处理的,即是遇到src所指向的地址时,会在地址前面加上server地址也包括当前页面上层的目录。比如下面这个页面:对应的目录结构如下:



 
<% @ Page Language="C#" AutoEventWireup="true" CodeBehind ="Test.aspx.cs" Inherits ="TestWebForm.Test" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></ title>
    <script type="text/javascript">
        function a() {
            var url = ''../../../../../img/2.jpg'' ;
            window.location.href = url;      //a
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <a href="/img/2.jpg">test2 </a>    <% -- b--%>
        <input type="button" value="test" onclick="a();" /> 
        <asp: Image runat ="server" ImageUrl ="~/img/2.jpg" /><% -- c--%>
        <img src="~/img/2.jpg" /> <% -- d--%>
    </div>
    </form>
</body>
</html>


    webform中有服务器端控件和用户控件,对地址的处理是不一样的,如上 c是服务器端控件,其它三个都是html控件,对于服务器端控件,在遇到 "~"时表示从网站根目录开始查找,该符号对用户控件不起作用。b跟c是一样的,表示直接从网站根目录下开始查找。a中一个".."符号表示相对于当前页面上一层,上面的代码最终都会生成被浏览器所识别的html代码,如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>< title>

</title>
    <script type="text/javascript">
        function a() {
            var url = '../../../../../img/2.jpg' ;
            window.location.href = url;
        }
    </script>
</head>
<body>
    <form method="post" action="test.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE1MTU2MzE5MDhkZIwI/4pKeEnEJImhuKV9fW5S+UzNB38FPzBJ057M//29" />
</div>

<div class="aspNetHidden">

         <input type="hidden" name="__VIEWSTATEGENERATOR" id ="__VIEWSTATEGENERATOR" value="05E1810D" />
</div>
    <div>
    <a href="/info/a/img/2.jpg">test2</ a>
        <input type="button" value="点击按钮显示图片" onclick ="a();" />
        <img src="../../../../../img/2.jpg" />
        <img src="~/img/2.jpg" / alt="img html标签">
    </div>
    </form>
</body>
</html>

    从结果中可以看到,~ 最终被解释成"..",对于被包含在字符串中、用户控件、html标签有src的,只能通过 "/ " 或".." 来指定文件的地址。一般的把附件放在指定的目录下,相对于附件所在的目录,aspx页面距离a个层级的,有a个".."符号处理,有时页面所在层级较深时,比较容易出错,也可以直接用"/" 符号直到附件所在目录。

   aspx页面间进行跳转时,若是使用js或html标签,注意页面之间的上下层级,也可以直接借助vs智能提示,输入src属性时会自动供选择跳转的页面。

  ps:相对地址和绝对地址比较简单,但是在工作中出过两次这样的错误,一部署到正式环境,结果报错404,所以总结一下,做一个简单的demo,查看生成的html源代码,比较 ".." 、 "/" 、"~"之间的区别。个人觉得做事情都是逐步完善,循序渐进的,由一开始不熟悉,到后面效率越来越高,事情的结果(发布产品)也是这样,逐步稳定慢慢细化,持续构建的过程。但是在实际的工作中,往往不能允许个人犯低级的错误,两次下来给人的印象就是不负责不认真。这让我想起了第一年参加工作的场景,老大人很好,基本上不怎么批人,几次低级的错误下来:
(1)提交svn不必要的文件不要提交;
(2)说的工作目标一定要清楚;
(3)我交给你任务目地要的就是结果,别给我一个四不像,在解释一大堆;
(4)交付要实际的东西,不能打折扣啊,做了80%,细节问题不注意;
(5)遇到问题及时反馈,不懂的就要问;
(6)做工作要分优先级别,别一遇到问题就卡半天,一天过去了连简单的都没做;
(7)交代工作内容经过思考在问,别问的太详细,什么都告诉你了,还要你做啥;
(8)到目前为止提过多次的,微博优化、xinhua后台管理、安装部署文档、报表问题总结,最后一次领导谈话要求写一份文档都没落实;
  现在我来总结一下原因:
1、对他人的工作方式和沟通方式不熟悉;
2、对相关的业务不熟悉,不能很好地站在一定的高度看待问题,只能按部就班,交给什么做什么;
3、对技术(这指的是所用框架、编程语言特性)熟悉度不够,前台要求复杂的js交互,后台用到多线程、webservice、改造mvc视图引擎、做一个winform的响应式布局、设计一个通用的检索数据库表结构、用到报表技术做一个选型并评估风险、做一个用户演示用的demo原型;
4、分不清业务问题和技术问题,开发中常见的问题认识不多,思考问题比较局限;
5、不能很好的表达,控制自我情绪;
6、编码少,缺总结、思考,常用的算法 工作中用到不能及时解决;
7、模式化的项目开发要求模块化、组件化、系统化、对面向对象的理解不深入,一个复杂的系统或模块就没办法分析了,理不清中间的逻辑,缺经验;
8、应用系统开发主要的还是业务,对整个业务和相关模块的业务理解不到位;在做项目的业务和其他产品关于此业务的设计,了解吗?为什么要这样做?缺少分析,所以工作很少有大的进展,很难独当一面;

    到新公司同样的问题依旧存在,这个真的需要时间,有的是因为对业务、对他人的沟通方式工作方式不熟,沟通过程中减少个人的发问,分门别类做好记录、及时确认,搞清楚目标,涉及到业务问题及时找相关人,做之前评估好时间和优先级,确认梳理清楚在做。也发现这样一种现象:业务专家一会把问题讲述完了,你也以为你清楚了,过程中还是有细节问题没确认,比如:今天挨批的这次,接收上个页面参数,查询数据并作处理,跳转到下个页面,跟那个类似,大家都清楚了,"那个"就是那个了,最后一部署一看结果,你可要知道,人都是利己的,最后还是找你事,两三次这样下来,印象就是不认真不负责。很明显这是项目中很难解决的沟通问题,没办法只能遇到一次做一次总结,尽量避免。还有一个办法就是走到领导的前面,对业务很熟,对技术很熟,对相关的系统或产品很熟,有个人思考,工作就不是按部就班了。所以做个小结,后面ps的多了,挨批两次倒记住了一句:把事情做好把结果做好,他人挑不出问题怎么批。
展开阅读全文

没有更多推荐了,返回首页