黑马程序员-ASP中级

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

         特殊路径标识“~”

和“/表示网站根目录(域名)./表示当前目录../表示上级目录”等Http标准定义不一样,~ASP.Net定义的特殊符号,是Asp.Net内部进行定义推荐的用法。推荐资源定义都使用~从应用根目录开始定义。应用根目录和网站根目录区别在于:如果将一个应用部署到http://www.rupeng.com/search这个目录下,应用的根目录是http://www.rupeng.com/search网站的根目录是http://www.rupeng.com/(创建WebWite进行演示,因为不同的WebWite都是在同一个根目录下的)因此最好用~,~并不会被浏览器认,因此Asp.Net会将这个路径转换成相对于网站的根目录的全路径再输出到浏览器。

举例,用~而不用/的好处。在Webwite中使用。

 

<asp:HyperLink ID="HyperLink1"runat="server"NavigateUrl="/learn.htm">HyperLink</asp:HyperLink>Text=ce1"会出错,不知为什么。

 

<a href ="/learn.htm">学无止境</a>

<a href ="~/learn.htm">学无止境</a><br/>

 

       <asp:HyperLink ID="HyperLink1" runat="server"NavigateUrl="/learn.htm">HyperLink</asp:HyperLink>

       

       <asp:HyperLink ID="HyperLink2" runat="server"NavigateUrl="~/learn.htm"Text="ce2">HyperLink</asp:HyperLink><br />

       <asp:HyperLink ID="HyperLink3" runat="server"NavigateUrl="~learn.htm"Text="ce1">HyperLink</asp:HyperLink>

 

编程处理“~“

在服务器控件中(使用run =server的控件)会自动将"~"进行转换,如果在Html控件或者需要在代码中转换的话可以使用VirtualPathUtility.ToAbsolute("~/a/b.htm"),就是将虚拟路径转换为相对于应用根的全路径,也就是http://localhost:2326/WebSite1/a/b.htm

代码如下protected void Page_Load(object sender, EventArgs e)

    {

       Response.Write("<a href='"+VirtualPathUtility.ToAbsolute("~/a/b.htm")+"'>动态的</a>");

    }

VirtualPathUtility类主要方法stringAppendTrailingSlash(String virtualPath);如果路径VirtualPath最后没有"/"则添加。

         Response.Write(VirtualPathUtility.Combine("~/huang/jiang","miao.htm"));

       Response.Write(VirtualPathUtility.Combine(VirtualPathUtility.AppendTrailingSlash("~/huang/jiang"),"miao.htm"));

 

 

Reqution对象

Response.Write(Request.AppRelativeCurrentExecutionFilePath);获取当前执行请求相对于应用根目录的虚拟路径,以"~"开头。

 

       Response.Write(Request.AppRelativeCurrentExecutionFilePath);//获取当前执行请求相对于应用根目录的虚拟路径

       Response.Write(Request.PhysicalApplicationPath);//获取当前应用的物理路径。

       Response.Write(Request.PhysicalPath);//获取当前应用的物理路径

       Response.Write(Request.RawUrl);//获得原始请求的URL

       Response.Write(Request.Url);//获得请求的URL,区域涉及到URL重写问题。

       Response.Write(Request.UrlReferrer);//网页的来源,可以根据这个判断从百度搜索的关键词,防下载盗链,防图片盗链,可以伪造(比如迅雷),“本图片仅供XXXX内部网使用”在DZ中测试,全局防盗链用。例:在一般处理程序.ashx

using System;

using System.Web;

 

public class 图片 : IHttpHandler {

   

   public void ProcessRequest (HttpContext context) {

       context.Response.ContentType = "img/JPEG";

       string fullpath =HttpContext.Current.Server.MapPath("janpanmm.jpg");

       using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(fullpath))

       {

           using (System.Drawing.Graphics g =System.Drawing.Graphics.FromImage(bitmap))

           {

                if (context.Request.UrlReferrer== null)//如果直接浏览则没有UrlReferrer

                {

                    //g.Clear(System.Drawing.Color.Red);

                    g.DrawString("Prohibitdirect view picture,Please page review images", newSystem.Drawing.Font("宋体", 15), System.Drawing.Brushes.Blue, 0, 0);

                }

                else if(context.Request.UrlReferrer.Host != "localhost")

                {

                   g.Clear(System.Drawing.Color.Red);

                    g.DrawString("本图片仅供内部交流使用",new System.Drawing.Font("宋体", 15), System.Drawing.Brushes.Blue, 0, 0);

                

                }

           }

           bitmap.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);

       }

    }

 

   public bool IsReusable {

       get {

           return false;

       }

    }

 

}

 

       Response.Write(Request.UserHostAddress);//获得访问者的IP地址。

       Response.Write(Request.UserLanguages);//获得访问者浏览器支持的语言。可以通过这个实现对不同语言的人显示不同语言的页面。

       Response.Write(Request.Cookies);//获得浏览器发过来的浏览器端发过来的cookie,从它里面读取Cookie值,比如context.reqution.cookies["mysessionid"],使用Reqution.Cookies时一般只是读取,将Cookie写回到浏览器要用Response.cookies

 

 

Response对象

响应的缓冲输出:为了提高服务器的性能,ASP.Net向浏览器Write的时候,默认并不会每Write一次都会立即输出到浏览器,而是会缓存数据到合适的时机或响应结束才会将缓存区的数据一起发送到服务器。

Response的主要成员:

1Response.BufferResponse.BufferOutput):经过Reflector编译,发现两个属性是一样的,Buffer内部就是调用BufferOutput,这个属性用来控件是否采用响应缓存,默认是True

2Response.flush将缓存区的数据发送给浏览器,这在需要将Write出来的数据立即输出到浏览器非常适用。案例:大批量数据的导入,显示正在导入第?条,用ThreadSleep模拟耗时。

 public void ProcessRequest (HttpContextcontext) {

       context.Response.ContentType = "text/html";

       for (int i = 1; i <= 20; i++)

       {

           System.Threading.Thread.Sleep(500);

           context.Response.Write(""+i+"步执行完成<br>");

           context.Response.Flush();//强制将缓存区的数据发送给客户端浏览器。

       }

    }

3Response.Clear清空缓存区数据,这样在缓存区中没有发送到浏览器的数据被清空,不会被发送到浏览器。在用aspx输出非Html中的例子中经常看到用clear来清除httpmodule等给附加的内容(推荐用ashx,不用要aspx

4,Response.ContentEncoding输出流的编码。

5Response.contentType输出流的内容类型,比如是Html(text/html)的还是普通文本plain(text/plain)还是JPEG(image/JPEG)

6Response.cookies返回给浏览器的Cookie的集合,可以通过它设置Cookie

7,Response.OutputStream输出流,在输出图片,Excel文件等非文本内容的时候要使用它。

8Response.End()终止响应,将之前缓存中的数据发给浏览器,End()之后的代码不会被继续执行,在终止一些非法请求的时候,比如盗链接可以用End()立即终止请求。

9Response.Redirect(URL)重定向浏览器到新的网址,既可以重定向站外网址也可以重定向站内网址,Redirect是向浏览器发回302重定向,是通知浏览器“请重新访问URL这个网址”,这个过程经历了服务器通知浏览器“请重新访问URL这个网址”和浏览器接到命令后访问新网址的过程,使用Httpwatch查看整个响应过程的Http报文,用Redirect因为是浏览器自己重新去访问新网址的,所以在地址中是可以看到网址的变化的,后面会用来防止刷新浏览器时提示“重试”。

10,Response.SetCookie(Httpcookie cookie),向输出流中更新写到写到浏览器中的Cookie。如果Cookie存在就更新,不存在就增加。是对Response.Cookies的简化调用。

11Response.Write()和浏览器输出文本内容。

12Response.WriteFile(filename)向浏览器输出文件,不推荐使用。

 

 

Server对象

ServerContext的一个属性,是HttpServerUtility类的一个对象。

Server.HtmlEncode()Server.HtmlDecode()Server.UrlEncode()Server.UrlDecode()是对HttpUtility类中相应方法的一个代理调用,个人推荐总是使用HttpUtility,因为有的地方很难拿到Server对象,别把HtmlEncodeUrlEncode弄混了,UrlEncode是处理超链接的,HtmlEncode是处理Html代码的。

Server.Transter(path)内部重定向请求,Server.Transfer("picture.aspx");将用户的请求重定向给picture.aspx  ,是服务器内部的接管,浏览器是意识不到这个接管的,不是像Response.Redirect(URL)经历了服务器通知浏览器“请重新访问URL这个网址”和浏览器接到命令后访问新网址的过程,是一次Http请求因此浏览器地址栏不会发生变化(联想呼叫中心坐席告诉客户一个号码和帮助客户转接的区别),因为是内部接管,所以在被重定向到页面中是可以访问RequestCookies等这些来源页面接受的参数的。就像这些参数是传递给他的,而Response.Redirect则不得,因为它是让浏览器去访问的。注意Server.Thanster是内部接管,因此不能像Response.Direct重定向到外部网站(常考)访问/Server.Transfer("SetUp.ashx");会有错误。不能直接定向到.ashx页面中,要作额外的处理。知道行了。

有时候不能拿到HttpContext对象,比如在Global.asax中(后面讲)可以通过HttpContext.Current拿到当前的HttpContext,进而拿到ResponseRequestServer等。  

 

Page类成员

1RequestResponseServer属性,对Context.RequestContext.ResponseContext.Server的简化调用。

2AppRelativeVirtualPath属性,获得页面相对于应用根路径的路径。比如~/default.aspx

3FindControl(ctrlId),根据控件的Id找到控件,一般情况下直接在代码中写控件Id引用控件就可以了,但是对于有些场合使用ListView等控件的模板,编写自定义控件等则需要使用FindControl来引用控件,FindControl的返回值是Control,一般需要显示转换为相应的控件:

TextBox2.Text = "幸福心理学";

           TextBox txt = FindControl("TextBox1") as TextBox;//类似getElementById

           txt.Text="如何去改变";

 

4IsPostBackSession

5ResolveClientUrl(url)将虚拟路径转换为客户端访问时的路径,比如ResolveClientUrl("~/a/b.aspx")结果是a/b.aspx,这通常在ListView控件的模板中输出HTML使用,基本就是对VirtualPathUtility.ToAbsolute(AppRelativeVirtualPath)简化调用。考虑当前页面的相对路径,生成的路径比较短。

ResolveUrl(url)将虚拟路径转换为相对于网站根目录的路径,不考虑当前页面,irtualPathUtility.ToAbsolute直接转换为一个全路径。

 

    

         Asp.Net服务器端基本控件介绍

ASP.Net服务器控件是ASP.NetHTML的封装,在C#代码中就可以用txt.Text='abc'这种方式来攸Input的值,ASP.Net会将服务器端控件渲染成HTML代码输出给浏览器。服务器控件是ASP.Net非常吸引初学者非常容易上手的东西,也是最被人诟病的东西,物尽其用,服务器端控件在内网系统,互联网系统的后台部分等访问频率不高的地方用的还是很合适的。

所有的ASP.Net大部分都是从ControlWebControl类继承的,几乎都有成员有:

1ClientID,控件在客户端的ID,控件在服务器端的ID不一定等于客户端HTML中的ID,比如说在ListView等控件的模板中。因此如果要在客户端通过JavascriptDOMJQueryGetElementById$("#id")来操作控件的话最好不要直接写服务器端Id,而是$(#<%=txt1.ClientID%>。用JQuery事件设置鼠标移到控件上和从控件移开的不同样式,在用户控件中就可以看到ClientIDId的不同。

2Visible属性,控件是否可见,如果Visible=False是不会渲染到HTML中的,这和在HTML中给元素style.display='none'效果是不一样的。

3 CssClass属性,控件的样式名,就是HTML中控件的Class属性。

4Attributes,用来设置获取控件的额外属性。和DOM中的SetAttribute(),getAttribute()是一样的。

 

         ASP.net服务端基本控件1

一,Label控件,Text属性为显示文本,AssociatedControlID属性用来关联一个控件,如果为空的话会展示为一个Span,如果指定一个控件的id,则会展示为一个HTML中的<Label>并且将for属性设置为被关联控件的ClientId

二,Literal控件也是展示一段文本,但是Literal控件不会渲染任何额外的标签,就是将Text属性的值展示出来而已。

三,TextBox控件,文本框控件。当AutoPostBack属性为True时,用户焦点离开TextBox就会造成Post提交表单,实现原理就是讲ASP.Net原理时的AutoPostBackTextChanged事件,文本发生变化的时候事件触发。ASP.Net中要提交表单最好调用_doPostBack方法。

四,RadioButton控件,渲染为input(type=radio),通过GroupName属性进行分组。

 

 

 

三种控件

HTML控件,ASP.NETHTML控件当成普通的字符串渲染到服务器,不去检查正确性,无法在服务器进行处理。

ASP.NET服务端控件,经过ASP.NET高度封装的控件,使用简单,运行在服务器端子,可以在服务器端使用C#代码进行操作,会渲染到客户端为HTML控件。

rumat = serverHTML控件,在HTML控件的基础上添加runat="server",也是运行在服务器端的,也可以在服务器端使用C#代码进行操作,也会渲染到客户端,不像ASP.NET服务端控件那样高度封装,暴露的属性大部分是普通HTML属性,和ASP.NET服务端控件相比的好处是:当需要在服务器端对控件进行操作的时候,如果控件没有被ASP.NET服务端控件封装时,用runat="server"HTML控件很方便,runat="server"HTML控件也会对虚拟路径,id--ClientID进行处理,所以在使用虚拟路径,UserControl中也可能用到,试验在WebUserControl中使用id

 
----------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ---------------------- 详细请查看:http://net.itheima.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值