分享

ASP.NET中级学习

 悟静 2012-05-19

1.     特殊路径标志“~

和“/”表示网站根目录(跟域名相关),../表示上级目录、./表示当前目录等Http标准定位不一样,“~”,~ASP.NET定义的特殊符号,是ASP.NET内部定义推荐的方法,推荐资源定位都使用“~”从应用根目录开始定义。

编程处理“~”,如果在服务器控件中,会自动将~进行转换,如果在html控件或者需要在代码中转换可以使用VirtualPathUtility类中的静态方法进行虚拟路径、全路径等的转换,比如VirtualPathUtility.ToAbsolute(“~/a/b.sapx”)

 

2.     Request对象

Response.Write(Request.AppRelativeCurrentExecutionFilePath);//获取应用程序在网站内的虚拟路径

//比如这个例子将打印出的虚拟路径为~/Request/RequestTest.aspx

Response.Write("<br/>"+Request.PhysicalApplicationPath);//获取当前程序的物理路径(服务器硬盘中的路径)

//比如这个例子的E:\学习资料\ASPNET\ASP.NET中级学习\

Response.Write("<br/>"+Request.PhysicalPath);//打印出当前页面的物理路径

//E:\学习资料\ASPNET\ASP.NET中级学习\Request\RequestTest.aspx

 

Request.UrlReferrer防盗链,判断图片页面的UrlReferrer是否来源于本站,不是的话就给出提示信息和相关处理。

 

Response对象

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

 

Response对象的主要成员:

1.Response.BufferResponse.BufferOutPut,两个属性是一样的,Buffer内部就是调用的BufferOutPut。这个属性用来控制是否采用响应缓存,默认是true。(除非有特殊需求,一般不用去改它)

 

2.Response.Fush()将缓冲区的数据发送到浏览器,如果需要将wirte出来的数据立即输出到浏览器的场合,用这个是非常合适的。案例:大批量数据的导入,显示正在导入第几条数据,用Thread.Sleep模拟耗时。

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();  //可以看到浏览器中的数据一条一条的打印出来,而不是之前那样刷一下全部打印出。

        }

3.      Response.Clear()  清除缓冲区中的内容,这样做,缓冲区内的数据直接删除掉。

4.      Response.ContentEncoding 可以用来设置和获取输出流的编码格式,但一般情况下不必设置。

5.      Response.ContentType  输出流的内容类型,比如是htmltext/html)还是普通文本(text/plainJPEG图片(image/JPEG

 

6.      Reponse.Cookies返回给浏览器的cookie的集合,可以通过它设置cookie。但是我们可以直接用Response.SetCookie(c);其实内部处理,它帮你Response.Cookies.Add(c);

 

7.  Response.OutPutStream输出流,在输出图片、excel文件等非文本文件的时候要使用它。例如:bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);将一个图片输入到浏览器中。

 

8.  Response.End();终止页面请求,不再往下执行了。将之前缓存中的数据发送到浏览器,在终止一些非法请求的时候,比如盗链等可以用End()立终止请求。

Response.Write("当ì?à前??网a?站?禁?止1访¤?问¨o!ê?");

Response.End(); //终止请求。不再往下执行了。

Response.Write("你看不到我!");

 

9.        Response.Redirt(“http://www.”);重定向到新的页面,新的资源(如图片等),可以导航本站之外的网址。

10.    Response.SetCookie(HttpCookie cookie),向输出流中更新写到浏览器中的cookie。是对Response.Cookies的简化调用。

11.    Response.Write()向浏览器输出内容。

12.    Response.WriteFile()向浏览器中输出文件,比如Response.Write(“c/boot.ini”);

 

 

Server对象

Server是context的一个属性,是HttpServerUtility类的一个对象

Server.HtmlDecode() , Server.HtmlEncode()  html编码,防止xss漏洞

Server.UrlDecode()   server.UrlEncode()   网站url地址编码。处理超链接的。

用HttpUtility也能点出这四个方法,因为有的地方很难拿到Server对象。

 

Server.Transfer()内部重定向请求,将用户的请求重定向给另一个页面处理,是服务器内部的接管,浏览器是意识不到这个接管的。不像Response.Redirect那样经历:通知浏览器重新访问url地址—>浏览器接受命令访问另一个页面à返回给用户这个过程。因此浏览器地址栏不会变化。因为是内部接管,所以在被重定向到的页面中是可以访问到Request,cookies等这些来源页面接受的参数的,就像这些参数也是传递过去一样。

注意Transfer是内部接管,因此不能像Redirect那样重定向到外部网站。

 

使用Server.Transfer不能直接重定向到ashx,否则会报错“执行子请求出错”

有时候不能拿到HttpContext对象,比如在Global.asax,可以通过HttpContext.Current拿到当前的HttpContext,进而拿到Response,Request,Server等。

 

HttpHandler1

1.      动态生成搞笑图片,在某个图片的某个位置动态的写入字符串,其功能就跟logo网站生成图片一样。

 

2.  让浏览器弹框下载:如果输出的是html,txt,jpeg等类型的信息,浏览器会直接显示,如果希望弹出保存对话框,则需要添加Header:context.Response.ContentType = "image/JPEG";

string filename = HttpUtility.UrlEncode("杨凤辉.jpg");

context.Response.AddHeader("Content-Disposition","attachment;filename="+filename);//添加报文头到输出流

context.Response.WriteFile("杨凤辉.jpg"); //把文件写到浏览器输出流中。

 

添加报文头,让浏览器以attachment的形式打开文件(即下载附件)

 

 

application/x-excel 下载Excel表格时候的内容类型 ContentType=” application/x-excel”。 application/octet-stream 下载所有文件都ok。

 

动态创建Excel表格

context.Response.ContentType = "application/x-excel";

            string filename = HttpUtility.UrlEncode("动态数据.xls");context.Response.AddHeader("Content-Disposition","attachment;filename="+filename);

//建立新的 Excel 工作簿 

HSSFWorkbook hssfworkbook = new HSSFWorkbook(); 

  //在 Excel 工作簿中建立工作表,名稱為 Sheet1 

HSSFSheet sheet1 = hssfworkbook.CreateSheet("bitch"); 

  //寫入資料到工作表中 

sheet1.CreateRow(1).CreateCell(0).SetCellValue("hello"); 

sheet1.CreateRow(2).CreateCell(0).SetCellValue("3.14"); sheet1.CreateRow(3).CreateCell(0).SetCellValue("Are you bitch??"); //将新建的Excel表格写到浏览器缓冲区中。  hssfworkbook.Write(context.Response.OutputStream);

 

图库练习:登录处理,防暴力破解:在用户表里面增加两个字段,一个是锁定标志IsLock,和一个锁定后一定时间后方可重新试登录的OpenTime地段。

如果用户连续五次登录密码都错,那么就设置IsLock为1,同时开放时间为当前时间加上30分钟。

if (user.IsLock == 0) //防暴力破解

{

if (tryCount < 5)

{

tryCount++;

if (user.PassWord == TextBox2.Text.Trim())

{

tryCount = 0;

Session["UserId"] = user.Id;

Session["UserName"] = user.UserName;

Response.Redirect("PicDownload.html");

}

else

{

Label1.Text = "密码错误!";

}

}

else

{

adapter.UpdateDataByUserName(1, DateTime.Now.AddMinutes(2), TextBox1.Text.Trim());

Label1.Text = "五次尝试密码均错该账户已被锁住,请三十分钟后再试!";

tryCount=0;

}

                       

}

else if (user.IsLock == 1)

{

if(DateTime.Compare(user.OpenTime, DateTime.Now) > 0)

{

Label1.Text = "该账户已被锁住,请三十分钟后再试!";

}

else

{

adapter.UpdateDataByUserName(0, null, TextBox1.Text.Trim());

tryCount++;

if (user.PassWord == TextBox2.Text.Trim())

{

tryCount = 0;

Session["UserId"] = user.Id;

Session["UserName"] = user.UserName;

Response.Redirect("PicDownload.html");

}

else

{

Label1.Text = "密码错误!";

}

}

}

在一般处理程序页面中,如果需要用到session的话,必须先让这个页面的类实现IRequiresSessionState接口

功能:指定目标Http处理程序需要对回话状态值具有读写访问权利,这只是一个标志接口,没有任何方法。

public class PicDownload : IHttpHandler, IRequiresSessionState

下载图片处理

T_UsersTableAdapter adapter = new T_UsersTableAdapter();

                var data = adapter.GetDataById(int.Parse(context.Session["UserId"].ToString()));

                var user = data.Single();

                if (user.Level == 1)

                {

                    string PicPath = "~/img/"+filename;

                    if (PicPath.IndexOf('.')!=6)

) //此处有漏洞风险,防止用户通过拼凑请求参数的方法非法下载网站内源代码。

                    {//PicDownload2.ashx?FileName=../PicDownload2.ashx.cs.这样就可以下载了,所以要判断下载的文件路径是否在img目录下的,如果不是则不让下载。

                        context.Response.WriteFile(PicPath);

                    }

                }

 

 

 

 

M秒后自动跳转到其他页面:

1.<meta name=”refresh” content=”3” url=b.htm”>

2.JavaScript 的定时器。

 

 

Select ISNULL(ErrorTimes,100) from T_users

如果ErrorTimes字段为null,就设为100

 

WebForm 1

WebForm分为两个文件aspx和aspx.cs,aspx是 面模版,是页面描述文件,就是html的内容,和aspx结合的更好,不用像一开始那样程序员自己去填充模版,空间都是定义在aspx中,内联的javascript,css都是现在aspx中的,服务端的C#代码定义在aspx.cs中,Aspx控制页面的长相,cs控制程序逻辑,种前aspx后cs的方式被称为CodeBehind。

 

相当于以前的html+ashx的模式。Aspx就是”模版引擎”

cs可以调用aspx中的控件,aspx中也可以访问cs中定义的字段、函数,还可以编写复杂的C#代码,for等所有C#代码都可以写在aspx中。(不推荐这样)

<%for (int i = 0; i < 10; i++){%>您好!<%} %>

可以在页面上写一些简单的代码---跟jsp一样。

 

<%=myName %>  “=”表示输出表达式。myName是后台cs代码中定义的属性。

<%=getName(); %>  getName()是一个方法。属性方法的成员级别必须是protected或者是public不能是private的

 

Aspx于cs之间的关系。

 

aspx、cs、dll之间的关系。

 

Response.Write(this.GetType()+"<br/>");//取得当前对象的类

Response.Write(this.GetType().Assembly.Location+"<br/>");//取得但前对象的assembly地址。

Response.Write(this.GetType().BaseType+"<br/>"); //取得当前对象的父类

Response.Write(this.GetType().BaseType.Assembly.Location + "<br/>"); //取得当前对象的父类的assembly地址

当前页面执行时的类是后台代码类的一个子类。前后台之间是继承关系。

 

Page类

 

Page类成员:

1.Request,Response,Server属性:对context.Request, context.Response, context.Sever的简化调用。

1.      AppRelativeVirtualPath 属性:获得页面相对于应用根路径的路径,比如:~/Default.aspx

2.      FindControl(crlId),根据控件的id找到控件。一般情况下直接在代码中写控件的id引用控件就可以了,但是对于一些场合:使用ListView等控件的模版、编写自定义控件等则需要使用FindControl来引用控件,FindControl返回值是Control  (TextBox)FindControl(“TextBox1”).Text=“aaa”;

3.      IsPostBack ,Session.

4.       ResolveClientUrl(url)将虚拟路径转换为客户端访问时的路径。比如ResolveClientUrl(“~/a/b.aspx”)结果是a/b/aspx,这通常在ListView等控件的模版中输出html使用。基本就是对VirtualPathutitlity.ToAbsolute的简化调用。

 

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

 Aspx.Net服务端控件是asp.net对HTML的封装,asp.net会将服务端控件渲染成html代码输出给浏览器。服务端控件是asp.net非常吸引初初学者、非常容易上手的东东,也是最被人诟病的东西。但是,物尽其用,服务端控件在内网系统、互联网系统的后台部分等访问频率不高的地方用的还很适合的。

(如果用的不好,会产生很多viewstate等不需要用到的代码,还有,asp.net服务端控件是通过post提交的,get方法也可以,但几乎没法用,很多场合,特别是在开发互联网程序,用post是很麻烦的。)

Asp.net应用是有限制的,比如开发一个企业的进销存系统(企业内部用的),不是一种互联网系统,互联网系统的后台,开发就很方便简单。做互联网前台,对服务器控件就要有所取舍,也不是完全不用。

 

Asp.net简单易用,不要因为它简单就不屑,我们应该调整好心态,怎样利用简单的东西早出复杂的系统,这才是我们需要做的。

 

asp.net控件,大部分都是从Control,WebControl类继承的,几乎都有的成员:1.ClientID。获得控件在客户端的ID。

document.getElementById('<%=TextBox1.ClientID %>').onmouseover = function () {this.style.background = 'red';}

在客户端通过javascript和jquery等操作控件时,必须要用('<%=TextBox1.ClientID %>').的方法取得控件id。好习惯(有时候客户端和服务端的ID会不同。)

 

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

 

3. CssClass控件的css style属性

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

Button1.Attributes[“a1”]=”2.jpg”;

Button1.Attributes[“onmouseover”]=”alert('Hello man’)”;

 

基本控件:

1.      Label控件,用来显示文本,在客户端渲染成<span id=”Label1”>姓名</span> <span></span>跟div的区别,div占用一个区域,而span则放在哪就显示在那里。Label控件如果设置了 AssociatedControlId属性,它就会被渲染成相应控件的Label,点击Label,关联的控件就得到焦点。<label for=”TextBox1” id=”Label1”>姓名</Label>

2.      Literal控件不渲染任何元素。纯文本显示在客户端。设置了Mode属性为Encode后,文本还会自动的进行HTML编码。

3.      TextBox控件,文本框控件,TextMode属性取值SingleLine,MultiLine、Password,分别渲染成intput(type=text)、textarea、input(type=password)、当AutoPostBack属性为true的时候,用户焦点离开TextBox就会造成Post,实现原理就是讲Asp.net原理时的AutoPostBack. 用javascript提交表单,_doPostBack( );在ASP.Net中要提交表单的时候,最好直接调用_doPostBack(); TextChanged事件,文本发生变化的时候事件触发。

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

 

5. Button控件。OnClientClick属性,当用户点击按钮的时候,在浏览器端执行的代码,注意OnClientClick是字符串属性,写的代码是javaScript代码,运行在浏览器端。<asp:Button ID=”btnDel” ruant=”server” onclientclick=”return confirm('真的要删除吗?’)” Text=”删除”/>

 

6.LinkButton控件。在客户端渲染成一个超链接:这是一个特殊的超链接:      <a id="LinkButton1" href="javascript:__doPostBack( )">LinkButton</a>点击它就提交表单,相当于一个按钮。

7.ImageButton控件。客户端渲染成input(type=image)

<input type="image" name="ImageButton1" id="ImageButton1" src="../img/Abu.gif" />

 

8.Button,LinkButton,ImageButton等控件都有 CommandName,CommandArgument两个属性和Command事件,可以让多个按钮控件共享一个Command时间处理函数,通过读取事件对象e的CommandNam、CommandArgument两个属性读取被点击按钮设置的这两个参数来执行不同的操作。例如:编辑、删除多行数据。这种用法在ListView等控件中用的最多。

 

9.Panel控件,一般渲染成一个div。但如果设置了GroupingText属性后:会渲染成fieldset。

<fieldset><legend>Panel组件</legend></fieldset>

 

10.HyperLink 超链接:引用站内资源的时候比较方便,自动帮你转换路径,如果引用互联网地址如百度,则直接用<a>标签就ok了,减少服务器的负担。

 

11.FileUpload 文件上传:渲染成:input(type=file)

<input type="file" name="FileUpload1" id="FileUpload1" />

要预防WebShell漏洞:上传可执行的页面到服务器,然后在设法访问它,让他执行并破坏网站。

注册练习:

验证码的生成:

public void ProcessRequest(HttpContext context)

        {

            string str="";Random r=new Random();

            for (int i = 0; i <= 4; i++)

            {

                int j=r.Next(10);

                str = str + j;

            }

            context.Session["YanZheng"] = str;

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

            using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(55,20))

            {

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

                {

                   g.DrawString(str, new System.Drawing.Font("宋?体??", 14), System.Drawing.Brushes.Red, 0, 0);

                  }

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

            }

        }

C#中的正则表达式于js中差不多

 

 

三种控件:

HTML控件,Asp.Net把控件当成普通的字符串渲染到浏览器端,不去检验正确性、无法在服务器端进行处理。(元素写错了也不会报错)

 

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

 

runat=server的HTML控件。在HTML控件的基础上添加 runat=server,也是运行在服务器端的,也可以使用C#代码进行操作,也会渲染到客户端,不像Asp.net服务器控件那么高度封装,暴露的属性大部分是普通HTML属性。和Asp.net服务器控件相比的好处是:当需要在服务器端对控件进行操作的时候,如果控件没有被Asp.net服务端控件封装的时候,用ruant=Server的html控件很方便,runat=Server的html控件也会对虚拟路径、id->ClientID进行处理,所以在虚拟路径、usercontrol中也可能会用到 (可以用来操作超链接,<tr><td>

 

div等非控件加runat=server后,会变成HtmlControls.HtmlGenericControl类型的控件

封装了一些属性,如果想操作其他未封装的属性如“class”css样式类,可以通过div1.Attributes["class"] = "error"; 进行操作,这样的话,就可以使得div的样式为:error了。

 

a-àHtmlAnchor;   form-àHtmlForm;   head-àHtmlHead;

inputàHtmlInputButton  HTmlInpuCheckBox  HtmlInputText等、metaàHtmlMeat;  HtmlTable、HtmlTableRow  HtmlTableCell; HtmlTitle .未单独封装(如div)对应类型为HtmlGenericControl。使用Attributes属性操作为封装的属性。

 

验证控件:

不能为空校验:InitialValue="请填写姓名” 设定初始值,当控件是该值时,认为空。

页面中的IsValid属性用来判断页面中的所有Validator是否都校验通过了,只有都通过了才为True,几时页面中的Validator服务端校验报错,在服务器端方法中的业务代码也会被执行,因此如果代码在数据校验不通过时不让执行,则需要判断IsValid的值。

<span style="display:none">看不到我</span> 不占据空间

<span style="visibility:hidden">看不到我</span> 会占据空间

验证控件都有display属性,用来决定如何显示错误信息。有三个值:static:没有错误信息的时候控件的visiblity样式为hidden来实现隐藏。Dynamic:没有错误信息的时候用display样式为none来实现隐藏。还有一个为None。

 

都会在客户端和服务器端同时校验。

可以通过设置ValidationGroup来为其分组,有时候一个页面有两个表单,为使其互不干扰,就可以为其分组。类似于radiobutton。

 

如果将按钮控件的CausesValidation属性设为false,则这个按钮的点击不触发校验。

 

范围验证控件:RangeValidator。有Date,String,Double,int,等多种类型的数据可以选用,范围可以编程动态的设定。

 

正则表达式验证:可以自定义验证表达式:比如QQ号(5-11位的数字)\d{5,11}

个人说明10到50字之间 \w{10,50}

 

每个验证控件都有ErrorMessage、Text两个属性,ErrorMessage是用来显示到ValidationSummary控件中的值,Text是用来显示到验证控件上面的值,如果Text为空,则ErrorMessage会同时显示到汇总控件和验证控件上面。

 

 

母版页

母版页中,对图片的引用,可以会出现路径问题,需要用服务器端图片控件。

并将其路径设为相对路径,相对应用的路径。例如:ImageUrl=”~/images/banner.jpg” ;

也可以用ruant=server的HTML控件 src=”~/images/banner.jpg” ;

 

 

如果不希望用服务端控件占用过多资源,也可以通过ResolveClientUrl(”~/images/banner.jpg” )方法结合“html页面使用C#后台代码的方式:

<%= ResolveClientUrl(”~/images/banner.jpg” )%>动态转换路径。

 

<%@ Page Title="首页" Language="C#" MasterPageFile="~/母版/MyMaster1.Master" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="注册练习.WebForm1" %>

使用了母版的具体页面,需要改标题:只需更改最上边的 Page Title= “xx”.就ok了。

母版页中的服务器端控件必须放到runat=Server的form中。

 

如需在具体页面中操作母版页中的服务端控件,用到如下方法:

Button b = (Button)this.Master.FindControl("btnMaster");

b.Visible=false;

 

数据绑定控件简介

从数据绑定开始用WebApplication,否则会有很多麻烦。

数据绑定分为数据源和数据绑定控件两部分、数据绑定控件通过数据源来获得数据,通过数据源来隔离数据提供者和数据使用者,数据绑定控件通过数据源来对数据进行修改。

数据源有SqlDataSource、AccessDataSource、ObjectDataSource、LinqDataSource、EntityDataSource、XmlDataSource等,由于大部分项目都不会页面直接连接数据库(因为违反了最基本的分层原则),所以SqlDataSource,AccessDataSource都不会使用,LinqDataSource、EntityDataSource也是只有在很极端的采用Linq,EF的项目中才会用到。

XmlDataSource是处理xml数据时才可能会用。ObjectDataSource是web开发中应用最广的数据源,也能很容易的进行数据库切换。

 

数据绑定控件有列表数据绑定控件(DropDownList、 RadioButtonList、ListBox、CheckBoxList、BulletedList等)和复杂控件(DataGrid(2.0之后就没用了),GridView、DetailsView、FormView、ListView、Repeater、DataList)GridView等都是ListView子集。

Repeater是最轻量级的组件。在互联网的前台用的最多,ListView是ASP.Net3.5中新增的控件,ListView是GridView、DetailsView、FormView、Repeater、DataList等控件的大一统,那些控件的优点ListView全都有,会了ListView,其他控件就会用了,因此数据绑定控件主要讲列表数据绑定控件、Repeater和ListView,项目中会用到FormView、GridView。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多