元数据:代码中二进制级别达到重用,包括IL代码,类的属性,字段方法,程序集,资源等各种数据
VS中的的代码智能提示就是反射元数据来获取的,是这个.net中代码中灵魂
sqlconnection连接池(list集合,放在内存中):保存内连接对象
内连接对象跟连接字符串相关,当sqlconnection conn=new sqlconnection(strConn1)
就会创建一个内连接对象,此时会根据对象的连接的字符串去sqlconnection连接池中查看是否有该对象,如果有则取出来用。没有则创建
线程池:利用多线程的时候可以用,极大提高线程的利用率
线程池会自动,分配一个线程来执行,不要手动创建单个线程
QueueUserWorkItem()方法的委托
ThredPool.QueueUserWorkItem(ShowName,"str");
byte[] buffer=new byte[2*1024*1024];
file.read(buffer,0,buffer.length)
//buffer:将文件放入Byte数组(缓存)中
//0:表示从下标为0的位置开始填充
//buffer.length:每次做多能填充多少数据量
this.txtread.text=system.text.encoding.utf8.getstrings(buffer)
//把数组的数据转化为string类型
方法重入:
前台线程:所有前台线程都关闭后台程序才关闭
后台线程:thread.isbackground=true把当前线程设置为后台线程
后台线程:只要关闭了整个FROM UI线程,整个程序退出,所有的前台线程关闭,后台线程自动销毁
非抢占式调度:某个程序长期霸占CPU
抢占式调度:UPU的频繁切换
lock(this)//解决线程同步的问题,解决死锁,每次只允许一个对象访问 { }
动态网页的执行过程:
1、在浏览器端,如果用户 请求的是一个普通的HTML,那么iis服务器接收到该请求后,直接从iis所在的颠簸去查找
该html网页,找到后将该网页直接返回给我们的浏览器
2、如果用户访问的是一个aspx网页,我们的IIs处理不了 ,交给..netframework
来处理(执行aspx中的c#代码),执行完成后,将执行完成的结果构建
成HTML代码,交给IIS,在由IIs发送给浏览器
3、由aspnet_isapi.dll把aspx页交给.netframework去执行
请求报文:浏览器端按照Http协议的要求组织好的数据。并且将这些数据发送给服务器
告诉服务器浏览器可以显示处理各种文件
告诉服务器浏览器中文
告诉浏览器浏览器的版本,以及操作系统的版本信息
浏览器所使用的压缩模式
浏览器希望与服务器建立持久性链接(但是服务器在建立连接后会断掉与浏览器的连接)
get请求只有请求头没有请求体
post两者都有
响应报文:服务器返回浏览器端的数据
包含2部分内容:响应头,响应体
200:响应码,表示服务端处理成功
告诉浏览器服务器返回的数据类型
数据长度,响应报文体的长度单位是字节
静态的文件,直接读取:
第一次发送请求报文(get)
服务器返回响应报文,并返回页面(报文体)
浏览器进行解析,发现有图片,再次向服务器发送请求,使用post
当第二次请求的时候,浏览器会有缓存,服务器不会再给发报文
动态文件的读取
请求一个动态文件就是执行力该动态文件所属类里面的代码
必须要创建该类的实例
VS开发时使用的是卡西尼服务器
程序部署的时候使用IIS部署
ASP.net常用的文件扩展名
.ashx:一般处理程序,不需要返回大陆复杂的html代码时使用(采用HTML代码拼接的方式)
pubilc class Mycalss:IHttpHandler//首先要继承IHttpHandler接口 { public void ProcessRequest(HttpContext context)//应用程序上下文 { context.response.write("helloworld");//调用write } }
一般处理程序(HttpHandler):
是一个实现System.Web.IHttpHandler接口的特殊类。
任何一个实现了IHttpHandler接口的类,是作为一个外部请求的目标程序的前提。(凡是没有实现此接口的类,就不能被浏览器请求。)
它由支持ASP.NET的服务器调用和启动运行。一个HttpHandler程序负责处理它所对应的一个或一组URL地址的访问请求,
并接收客户端发出的访问请求信息(请求报文)和产生响应内容(响应报文)。
咱可以通过创建一个我们自己的HttpHandler程序来生成浏览器代码发送回客户端浏览器。
HttpHandler程序可以完成普通类程序所能完成的大多数任务:
1.获取客户端通过HTML的Form表单提交的数据和URL参数
2.创建对客户端的响应消息内容 3.访问服务器端的文件系统
4.连接数据库并开发基于数据库的应用
5.调用其他类
当浏览器请求发送到服务器电脑,电脑将请求交给指定80端口的软件IIS,IIS发现.aspx和.ashx它自己处理不了,
就将请求根据文件后缀名,交给IIS扩展程序 ASPNET_isapi.dll来处理(就去后台映射表根据后缀名找到相应的IIS扩展程序)。然后请求被交给HttpRuntime处理,HttpRuntime会将[http请求报文]封装到HttpContext对象中,
并通过HttpApplicationFactory来创建一个【HttpApplication】,同时将HttpContext对象传给它。
接下来,大部分处理都是由HttpApplication来完成的!包括 调用处理管道(一系列过滤器---本质上就是调用一系列委托)以及创建被请求的页面类的对象并处理。
静态网页直接读取并返回给浏览器,
用户通过浏览器访问一个动态网页
这个请求会交给IIS服务器,IIS服务器先判断文件的类型,发现
是自己处理不了的,就会交给IIS扩展程序,由aspnet_isapi.dll把aspx页交给.netframework去执行
HttpRuntime:对当前用户的请求的处理都由该类来完成
1、首先接收浏览器发送过来的请求报文,封装到一个名字叫HttpWorkRequest类中
2、创建一个HttpContext类:请求上下文,包含了请求过来的数据
信息(请求报文),该类有2个重要的成员HttpRequest,HttpResponse
HttpRequest:接收浏览器发送过来的请求(请求报文),从HttpWorkRequest类中获取报文信息
HttpResponse:将处理后的结果发送给浏览器(响应报文)
3、通过HttpApplicationFactory类来创建HttpApplication(创建的时候首先到HttpApplication池看下是否有该对象,如果有直接取出来,没有再创建)
4、由HttpApplication完成(调用类里面的ProcessRequest()方法来完成)对对应请求的处理,所以要将HttpContext作为参数传递到HttpApplication中(每个请求处理都是由对应的一个HttpApplication来完成)
5、由HttpApplication调用类里面的ProcessRequest()方法来完成对应的请求处理,执行请求管道中的19个事件,在第8个事件中完成页面的类对象的创建(反射+接口),在第11-12个事件之间
完成对页面类中的ProcessRequest方法的调用
接收传递的值的几种方式:?
使用Request的几个属性;
使用Post传值方式:
获取通过POST方式传来的数据
表单method=post
1、使用context.Request.Form["变量名"]
Get传递方式:
获取通过GET方式传来的数据
浏览器:超链接,和表单Method=get
2、使用context.Request.QueryString["变量名"];
使用Params 属性
客户端提交的数据集合
3、request.paramas["name"]
4、使用request["name"]
//通过这种方式获取的传递的值是交给程序内部去判断,
//最后还是根据name变量的实际传递方式来判断是Form还是Querystring
跳转:请求一个页面,如果那个页面有request.redict(重定向)
则报文返回时没有那个页面报文体,而是返回报文头 302 报文体(重定向后URL地址)
此时告诉浏览器我要重定向了
然后浏览器再次发送get请求,然后返回重定向后页面给浏览器
重定向:就是告诉浏览器你访问另外一个页面来。 原理:服务器向浏览器发送一个包含 302状态码和Location地址的响应报文,浏览器看到302后就会自动请求Location指定的页面。
context.response.end():终止执行,后面的代码不再执行
1、单选框name相同时相互排斥
只会将选中的单选按钮的值提交到服务器
"性别:男:<input type=‘radio‘ name=‘sex‘ value=‘男‘> <input type=‘radio‘ name=‘sex‘ value=‘女‘>
2、复选框name可以相同,只会将选中的复选框的值提交到服务器(选中几个提交几个)
提交值中间用逗号分隔
都是只读属性,2者的区别:
disadled=‘disadled‘ //设置的默认值不会向服务器提交
readonly=‘true‘//设置的默认值值会向服务器提交
根据隐藏域的值来判断,第一次请求的时候隐藏域的值为null,点击按钮提交的时候(第二次)可以获取到里面的值
if(!string.IsNullOrEmpty(context.Request.Form["hidden1"])) {}
获取文件的相对路径(虚拟路径)(model.htm)或绝对路径(物理路径)(c:\model.htm),一般读取网站中文件.txt子类的,或用到Server.MapPath(),获取请求网页的时候用虚拟路径
string path = context.Server.MapPath("Model.htm");//相对路径 string path1=context.Request.MapPath("Model.htm");//效果同上 string html = System.IO.File.ReadAllText(path); //读取文件
当我们点击【提交】按钮以后是浏览器将用户填写的文本框等控件中的值“提取”出来发送给服务器,而不是服务器来读取用户填写的这个页面。
哪些标签的哪些值会被提交给服务器呢?将用户填写的内容提交到服务器有如下几个条件:
1、只能为 input、textarea、select三种类型的标签。只有input(文本框、CheckBox等)用户才可能填写值,<label>、<p>、<font>等标签仅供显示用,没有提交到服务器的必要。
2、只有value属性的值才会提交给服务器。以input标签为例,input标签有title、type、disabled等属性,但是这些属性都是供显示用的,用户并不能修改,
只有value属性才是用户输入的属性,因此只有value属性的值才会被提交到服务器。
3、标签必须设定name属性。学习Dom的时候我们知道如果要通过JavaScript操作标签,必须为标签设定Id。如果要将标签的value属性值提交到服务器,
则必须为标签设定name属性,提交到服务器的时候将会以“name=value”的键值对的方式提交给服务器,
多个键值对之间用&分割。除了单选按钮等少数标签之外,大部分标签的name的值不能重复。name是给服务器用的,id是给Dom用的。
对于RadioButton,同name的为一组,选中的RadioButton的value被提交到服务器。
如果设置了控件的disabled属性的话,浏览器也不会提交该控件的值。这是与readonly的区别
4、放到form标签内。只有放到form标签内的标签才可能会被提交到服务器,form之外的input等标签被忽略。
非表单元素无法将客户端的元素值传递给服务器端,即使是表单元素也只能传递value值,对于其他属性值比如背景颜色、大小等也是无法传递的,因此对于这些值都要存在隐藏字段中。
表单域只有设定了name的才会被提交给服务器(用get方式看的清楚)。如果给submit按钮设定name,那么按钮的value也会被提交给服务器
表单提交方式:Get与Post
还可以设定<form>的method属性指定表单提交方式,get(默认值)是通过URL传递表单值,post传递的表单值是隐藏到http报文体中,url中看到不。
get和post的区别(常考):get是通过url传递表单值,post通过url看不到表单域的值;get传递的数据量是有限的,如果要传递大数据量不能用get,
比如type=“file”上传文章、type=“password”传递密码或者<textarea>发表大段文章,post则没有这个限制;post会有浏览器提示重新提交表单的问题,get则没有(加分的回答)。
对于Post的表单重新敲地址栏再刷新就不会提示重新提交了,因为重新敲地址就没有偷偷提交的数据了。Post方式的正确的地址很难直接发给别人。
Get方式URL数据格式。服务端文件名后跟着“?”,由于客户端可能向服务器端提交多个键值对,键值对之间用“&”进行分割,如果URL中有汉字、特殊符号等,则需要对URL进行编码。
表单域只有设定了name的才会被提交给服务器(用get方式看的清楚)。如果给submit按钮设定name,那么按钮的value也会被提交给服务器
ASP.NET 第三阶段:WEBFROM的应用
在前台使用服务端代码,必须用<% 服务端代码%>
前台调用后台代码:
后台: protect string str="大家好"; protect string Hello() {return "你好!"; } 前台: <div><% for(i=0;i<10;i++) { response.write(i.tostring()+Hello()); } %></div>
在前台下面2者效果一样
<%=str%>
<% response.write(str);%>
在后台不能用<%=str%>,只能用response.write
在服务端运行,对服务器造成压力(runat="server"),一般不用服务端控件,除了一用的人比较少的时候
_default继承Page(已经封装了),直接用{response.write("wdawd")},而不用加context;
服务端控件根据ID来传值,浏览器解析还是根据name来获取(会自动加上与id相同的name)
response.write(this.txtname.value);
只要控件加了runat="server")。就可以response.write(this.Textbox1.text);
而没有加的时候,只是普通的标签,只能根据以前的context.request.Form["txtname"]来获取
所有的服务器控件最后输出到浏览器中,都是html代码
三种控件的取值应用:
普通的html控件:
<input type="text" name="txtPass" id="txtP" /> Response.Write(Request.Form["txtPass"]);
普通的html控件加runat="server",变成服务端控件,可以通过id.vaule来获取值:
<input type="text" name="txt" id="txtName" runat="server" /> Response.Write(this.txtName.Value);
服务端控件:id.text来获取值
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> Response.Write(this.TextBox1.Text);
在执行页面类中的
ProcessRequestMian():执行生命周期的方法,相应的事件中完成相应的工作
页面生命周期后期的Reader()方法:遍历控件树的readCobtrol方法,获取每个控件对于的html代码
服务器调用页面类的reader()(reader_control())方法来返回html代码
Response.Write(this.GetType().Assembly.Location + "<br/>");
根据上面的输出值来找到网站的dll文件,进行反编译
:C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\101444c5\d13c0df8\App_Web_31qbib3x.dll
<%@ Page Language="C#" AutoEventWireup="true" Trace="true"(加上这个会在页面上输出生命周期相关的信息) CodeFile="Default.aspx.cs" Inherits="_Default" (继承后台代码)%>
//前台文件继承后台文件_Default,并继承接口IHttpHandler
public class default_aspx : _Default, IHttpHandler
//所以前台文件可以访问后台文件的属性,方法等
//此时的前台文件就像一个复杂一点的ashx一般处理程序,使用接口创建页面类的对象,并调用
public override void ProcessRequest(HttpContext context);方法来完成处理
//new LiteralControl("\r\n\r\n<!DOCTYPE html PUBLIC \"-//")创建文本字符串的类
aspx最后继承自control类,可以说aspx也是一个控件
所有的子控件都放在 ControlCollection集合中
在aspx子类页面中,创建了一个HtmlForm对像,赋值给了父类的protected HtmlForm form1的属性
HtmlForm __ctrl = new HtmlForm();
base.form1 = __ctrl;
所以在父类后台代码中可以使用this.来获前台页面相应元素及值
如果前台的标签元素用runat=server来标识,则后台代码中为默认给当前那个元素创建一个对象属性
前台:HtmlInputText __ctrl = new HtmlInputText(); base.txtPwd = __ctrl;//给后台基类的txtPwd赋值,也就是为什么在后台可以this.获取前台的元素 ((IAttributeAccessor) __ctrl).SetAttribute("type", "text");//设置文本框类型 __ctrl.ID = "txtPwd"; __ctrl.Name = "name"; __ctrl.Value = ""; 后台:protected HtmlInputText txtPwd; 在From表单中调用委托,传递方法,来转化html代码并输出到浏览器中 public delegate void RenderMethod(HtmlTextWriter output, Control container); __w.Write("\r\n <div>\r\n <input type=\"text\" name=\"txtName\" value=\" \" />\r\n "); parameterContainer.Controls[0].RenderControl(__w);//调用RenderControl方法输出html __w.Write("\r\n "); parameterContainer.Controls[1].RenderControl(__w); __w.Write("\r\n "); parameterContainer.Controls[2].RenderControl(__w); __w.Write("\r\n "); __w.Write(base.SayHI()); __w.Write("\r\n "); for (int i = 0; i < 10; i++) { base.Response.Write(base.str); } __w.Write("\r\n </div>\r\n ");
HtmlTextWriter,将构建的html代码输出
将标记字符和文本写入到ASP.NET服务器控件的输出流,将转换过来的html代码输出到浏览器端
RenderControl():每个服务端控件都有一个RenderControl方法。将服务端控件转换成对于的html代码
然后填充到HtmlTextWriter类中,最后由HtmlTextWriter类将html代码输出到浏览器
//控件树
private void __BuildControlTree(default_aspx __ctrl)//树根,页面类对象 { this.InitializeCulture(); IParserAccessor __parser = __ctrl;//转换为接口 //将元素LiteralControl添加到default_aspx对象中 __parser.AddParsedSubObject(new LiteralControl("\r\n\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n")); HtmlHead __ctrl1 = this.__BuildControl__control2(); __parser.AddParsedSubObject(__ctrl1); __parser.AddParsedSubObject(new LiteralControl("\r\n<body>\r\n ")); //创建HtmlForm HtmlForm __ctrl2 = this.__BuildControlform1(); __parser.AddParsedSubObject(__ctrl2); //结束 __parser.AddParsedSubObject(new LiteralControl("\r\n</body>\r\n</html>\r\n")); }
aspx网页的执行流程:
1、用户通过浏览器访问,如果静态网页直接读取并返回给浏览器
2、如果是动态网页,这个请求会交给IIS服务器,IIS服务器先判断文件的类型,发现是自己处理不了的,
就会交给IIS扩展程序,由aspnet_isapi.dll把aspx页交给.netframework去执行。
3、在netframework中:
HttpRuntime:对当前用户的请求的处理都由该类来完成
4、首先接收浏览器发送过来的请求报文,封装到一个名字叫HttpWorkRequest类中
5、创建一个HttpContext类:请求上下文,包含了请求过来的数据
信息(请求报文),该类有2个重要的成员HttpRequest,HttpResponse
HttpRequest:接收浏览器发送过来的请求(请求报文),从HttpWorkRequest类中获取报文信息
HttpResponse:将处理后的结果发送给浏览器(响应报文)
6、通过HttpApplicationFactory类来创建HttpApplication(创建的时候首先到HttpApplication池看下是否有该对象(有空闲的),如果有直接取出来,没有再创建:通过Global.asax文件来编译并创建application对象)
7、由HttpApplication完成(调用类里面的ProcessRequest()方法来完成)对对应请求的处理,所以要将HttpContext作为参数传递到HttpApplication中(每个请求处理都是由对应的一个HttpApplication来完成)
8、由HttpApplication调用类里面的ProcessRequest()方法来完成对应的请求处理,执行请求管道中的19个事件,在第8个事件中完成页面的类对象的创建(反射+接口),在第11-12个事件之间
完成对页面类中的ProcessRequest方法的调用
9、在请求管道的第8个事件中创建页面类的对象,转换为IhttpHandeler接口对象
10、在请求管道的第11,12个事件之间执行页面类的ProcessRequst方法
11、在页面类中调用ProcessRequest()方法,此时会去调用父类的ProcessRequest()方法
public override void ProcessRequest(HttpContext context) { base.ProcessRequest(context); }
12、在父类的父类Page的ProcessRequest方法中先执行this.FrameworkInitialize();此时子类页面类重写了,调用页面类的FrameworkInitialize方法
来创建控件树
protected override void FrameworkInitialize() { base.FrameworkInitialize(); this.__BuildControlTree(this); base.AddWrappedFileDependencies(__fileDependencies); base.TraceEnabled = true; base.Request.ValidateInput(); }
13、调用ProcessRequestMain(),加载控件树,构建页面生命周期,一系列的事件代码
此时的load事件中页面对象元素已经创建并加载完毕,可以对控件的属性进行操作了
14、调用Render_Control方法,生成整个页面的HTML代码(遍历页面控件树里的每个控件,
分别调用每个控件的Render_Control方法,转为相应的html代码,最后生成整个页面的html代码)
15、调用Render_Control方法,将所有的html代码封装到同一个HtmlTextWriter参数中,最后将HtmlTextWriter中构建的html代码
(将标记字符和文本写入到ASP.NET服务器控件的输出流,将转换过来的html代码)输出到浏览器端
为什么cs可以调用aspx中的控件原因:在编译之后,前台文件中的所有runat=server的html标签控件都会在生成的后台文件类中产生一个对应的 HTML服务器端控件(protected HtmlGenericControl div1; ) 对象,
而且所有的 服务器端控件标签(<ASP:Button/>) 都也会在后台文件类生成 对应的 服务器端控件(protected Button Button1; ) 对象。
为什么aspx中也可以访问cs中定义的非私有成员:因为aspx所编译生成的类集成了cs类。
1: aspx页面中的控件是怎样进行组织管理的? 前台类对象是如何结合后台类的方法 生成整个页面的HTML代码?
html页面是通过DOM树来组织的。
--被请求时,控件树负责组织整个页面的内容。
页面类对象是通过控件树的方式,帮我们封装了整个页面的HTML代码和C#代码(服务端端控件)
(都封装在页面类对象的控件集合中,那么最后要生成页面的HTML代码的时候,只需要循环遍历整个控件树,并调用每个控件的Render_Control方法获得每个控件的HTML代码,就可以得到一个完整的HTML代码了)
控件树,将整个前台页面上所有的HTML代码和runat=server的控件标签转成
对应的控件对象,并存入前台页面类的Controls集合中(该集合属于Control
类里的,因为ASP.NET里所有的控件类都间接继承与Control类,所以每个控
件都有Controls属性--ControlCollection用来保存它的子节点)。(就是创建页面控
件树,前台页面类就是树的根节点),也就是控件树负责组织整个页面的内容。
接下来或在ProcessRequest方法中,调用页面类对象的Render_Control方法,生成整个页面的HTML代码(遍历页面控件树里的每个控件,分别调用每个控件的Render_Control方法,最后生成整个页面的html代码)
2:处理请求的过程。
(1):前台类如何访问后台类的成员?//(<%= %>)
(2) 后台类如何调用前台控件?//this.
(3) 前台类和后台类的关系?//继承
(4): 浏览器请求页面Default.aspx时,服务器通过反射创建了响应页面的对象来处理,这个类是哪个类?(前台类)
同时调用了这个对象的什么方法来处理请求。。(ProcessRequest)
(5)服务器调用页面类对象的什么东西返回HTML代码?
3:页面生命周期
当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面
, 完全识别 HTTP 页面处理程序类后,ASP.NET 运行时将调用处理程序的 ProcessRequest 方法来处理请求,来创建页面对象。通常情况下,无需更改此方法的实现,
因为它是由 Page 类提供的。接下来被创建页面对象的ProcessRequest方法使页面经历了各个阶段:初始化、加载视图状态信息和回发数据、
加载页面的用户代码以及执行回发服务器端事件。之后,页面进入显示模式:收集更新的视图状态,生成 HTML 代码并随后将代码发送到输出控制台。
最后,卸载页面,并认为请求处理完毕。其中页面对象ProcessRequest方法 完成的这一系列事件的处理过程就是Asp.Net页面生命周期
PreInit:准备开始初始化,此时在模板中定义的控件已经创建,准备初始化页面对象,以及初始化自定义控件。
Init:页面对象中的元素进行初始化.
InitComplete:页面对象已经初始化完成。此时页面对象已经准备好了。
preload:准备对页面对象中的控件进行操作
Load:最常用的事件,整个页面对象已经准备好.
控件事件:控件的各种事件在这个时间点触发
PreRender:准备生成页面。
PreRenderComplete;准备生成完成. SaveStateComplete:保存页面的状态
Unload:进行页面处理的收尾工作,由于页面已经生成,所以不能再修改控件的属性了。
response.redict(); server.Execute 方法 server.Transfer 方法
自己定义的类:class1
有的时候不能拿到HttpContext对象,比如在Global.asax中(后面讲),可以通过HttpContext.Current拿到当前的HttpContext,进而拿到Response/Request/Server等
ViewState原理:
使用方式: 作用域---页面级
保存数据方式:
ViewState["myKey"]="MyData";
读取数据方式:
String myData; if(ViewState["myKey"]!=null) {myData=(string)ViewState["myKey"];}
ViewState不能存储所有的数据类型,仅支持: String、Integer、Boolean、Array、ArrayList、Hashtable
使用ViewState的前提: 页面上必须有一个服务器端窗体标记(<form runat=“server”>) ,会自动生成一个指向本页的,post请求的纯html代码的form标签
使用ViewStatede时候,会在前台自动创建一个隐藏域name="__VIEWSTATE"
然后点击提交(submit)的时候,可以赋值取值操作,(__VIEWSTATE)本质上就是一个隐藏域,需要通过表单来提交的
后台文件代码:
int a=0; ViewStatede["num"]=a;
服务器将页面返回给浏览器的时候会将名称为num的隐藏域中的保存到前台界面中的名称name="__VIEWSTATE"的隐藏域中
点击提交按钮的时候,会将名称name="__VIEWSTATE"的隐藏域中值提交到服务器,保存到名称为num的隐藏域中
在页面生命周期的事件中,调用SaveAllState(),将名称为num的ViewState的值经过Base64编码,序列化保
保存到浏览器中的__VIEWSTATIC中
在loadState事件中,将名称为__VIEWSTATE隐藏域的值经过反Base64序列化操作,后重新
赋值给前台名称叫做ViewState["num"]中
服务器的多个隐藏域的值都加到浏览器的__VIEWSTATE中
如果在页面中使用ViewState,那么前台页面中的form runat="server" 不能省略
当点击提交的时候会更新ViewState中的值
只要前台页面中的form runat="server",
如果只是显示数据,可以禁用单个服务器控件的EnableViewState="false";也可以在网页的头文件中禁用整个页面的ViewState
用于交互的时候开启,数据访问量较少的时候
只要有服务端控件就会产生ViewState,除非这个页面都是纯html标签
至少有一个服务器端窗体标记(<form runat=“server”>),就会产生ViewState
使用ViewState的前提: 页面上必须有一个服务器端窗体标记(<form runat=“server”>)
VIEWSTATE适用于同一个页面在不关闭的情况下多次与服务器交互(自增的案例)
跨页面提交的__VIEWSTATE不会被目标页面装入页面的ViewState属性中(action指向别的页面的时候)
存储非表单域、非value值的容器:
表单元素的值与viewstate没有关系,禁不禁用都无所谓,因为表单元素的值并没有保存到名称叫__ViewState隐藏域中
只要一点提交按钮就会提交表单元素的value值
viewstate一般不支持跨页面提交,aspx中一般只是提交到本页 <from runat="server">会解析成一个指向本页的,post请求的html代码
textbox本身上一个表单元素,input标签,禁不禁用viewstate都会想服务器提交值,也不会保存到viewstate中
而lable不是表单元素,也不是input标签,会解析成sapn标记,所以如果禁用viewstate=false的话,值不会保存到viewstate中,
而viewstate=true时会将label的text属性的值保存到viewstate中,然后每次提交到服务器,都是用viewstate的值来提交的,而不是把label中的值提交,因为会解析成sapn标记。
禁用ViewState的方法,禁用单个控件的ViewState设定enableviewstate=false,禁用ViewState以后TextBox版本不受影响,Div版本受影响,因为input的value不依靠ViewState。禁用整个页面的,在aspx的Page指令区加上EnableViewState="false" 。内网系统、互联网的后台可以尽情的用ViewState。
回答ViewState原理的时候:说Input版本(TextBox)自增和Div版本(Label)的不同。(完美!!!)-- 当某些控件的某些属性不属于浏览器表单的提交范围时,fw将会把这些属性添加到ViewState中保存。
WebForm的IsPostBack依赖于ViewState
IsPostBack原理:
只要有一个服务器端窗体标记(<form runat=“server”>),浏览器页面就会产生名称叫__ViewState隐藏域,服务器端窗体标记<form runat=“server”>会解析成一个指向本页的,post请求的html代码,
因为viewstate本质上是自动生成的一个隐藏域,点击提交按钮提交表单发送一个post请求过去(因为服务器端窗体标记<form runat=“server”>会解析成一个指向本页的,post请求的html代码,所以不会是form表单的get请求),把隐藏域的值提交到了服务器(只要不禁用viewstate,里面就是有值的(默认由form生成的))
那么此时IsPosrBack为true,而第一次get过来的IsPosrBack为false(第一次get请求页面,表单的值并没有提交到服务器,但是一旦点击提交按钮就会把__ViewState隐藏域中的值提交到服务器,就产生了回发事件,IsPosrBack就为true)
使用viewstate和IsPosrBack关联,第一次get,IsPosrBack为false,当点击提交按钮,触发回发事件(就像当前设置一个叫postback隐藏域,然后点击按钮的时候,判断是否有值,来判断是是否是回发事件,有数据的时候为true)
页面全是html控件时(去掉form后面的runat=“server”),不能使用viewstate,除非手动加个名称叫__ViewState的隐藏域,此时就可以传值到服务器(此时完全可以用以前的隐藏域的方式进行判断)
禁用页面的ViewState时候,页面还是会生成名称叫__ViewState隐藏域,只是不存储服务器控件的数据和状态,也可以用IsPostBack来判断是否回发,但是隐藏域中的数据会丢失,
此时(!IsPosrBack){..},get过来的时候会执行{..}中的代码,但是一提交,触发了回发事件的时候,{..}中代码就不会走,服务端此时就获取不到浏览器提交过来的隐藏域中值
因为禁用页面的ViewState时候,隐藏域就不存储服务器控件的数据和状态。__ViewState这个隐藏域没有值
服务器会去查看提交过来的报文中是否带着__ViewState这个隐藏域,如果带着,就是回发,是否就不是
一般规则与用法:
所以一般使用服务器控件就可以使用 IsPostBack来判断,如果是纯html表单就按原始的方式自己加个隐藏域根据隐藏域中是否有值来判断是get还是post
if(!IsPostBack) { this.dropDownList.Datasource=BLL.getAll(); this.dropDownList.DataTextField="CName"; this.dropDownList.DataValueField="CID" this.dropDownList.DataBing(); }
第一次get请求的时候会把值保存到客户端的__viewstate中
下一次提交的时候直接从隐藏域中发送过来(就没有必要再去读数据库了),因此如果用if(!IsPostBack)后并没有再去读数据库中的值
而此时如果又禁用页面的__viewstate就没有值,就提取不到值了,dropDownList就为空了。
而repeated控件中的值没有丢,是因为一点击分页按钮的时候重新调用了一个数据绑定的方法
server.Transfer():第一个页面直接调用第二个页面,执行完第二个页面后不再返回第一个页面,立即响应到客户端浏览器。(第一个页面的内容不输出,因此浏览器地址栏不会变化)
sever.Execute():第一个页面直接调用第二个页面,执行完第二个页面后再返回第一个页面执行,最后响应到客户端浏览器。(2个页面的内容都输出了,因此浏览器地址栏不会变化)
response.Redirect();直接到第二个页面,输出第二个页面的内容,浏览器地址栏会变化
Server.Transfer(path) 内部重定向请求,Server.Transfer(“JieBanRen.aspx”)将用户的请求重定向给JieBanRen.aspx处理,
是服务器内部的接管(不能重定向到外部网站),浏览器是意识不到这个接管的,不是象Response.Redirect那样经历“通知浏览器‘
请重新访问url这个网址’和浏览器接到命令访问新网址的过程”,是一次http请求,因此浏览器地址栏不会变化。因为是内部接管,
所以在被重定向到的页面中是可以访问到Request、Cookies等这些来源页面接受的参数的,就像这些参数是传递给他的,
而Redirect则不行,因为是让浏览器去访问的。注意Transfer是内部接管,因此不能像Redirect那样重定向到外部网站。
(常考)Response.Redirect就可以重定向到外部网站,不能内部重定向到ashx,否则会报错“执行子请求出错”.
Cookie:
Cookie是一种能够让网站服务器把少量数据(4kb左右)储存到客户端的硬盘或内存,并且读取出来的一种技术。
当你浏览某网站时,由Web服务器放置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、浏览过的网页或者停留的时间等网站想要你保存的信息。
当你再次通过浏览器访问该网站时,浏览器会自动将属于该网站的Cookie发送到服务器去,服务器通过读取Cookie,得知你的相关信息,就可以做出相应的动作。
最好是将要保存的内容在服务器端加密(安全,md5加密)
在硬盘中存放的位置与使用的操作系统和浏览器密切相关。
浏览器保存Cookie有两种方式: 1—浏览器的内存中(当没有设置cookie的过期时间时,存储在浏览器的内存中,此时如果关闭了浏览器,cookie就会丢失);
2—浏览器所在的电脑的硬盘中(当设置了cookie的过期时间)。
为将要写入到浏览器的Cookie对象设置失效时间: cook.Expires = DateTime.Now.AddMinutes(5);//设置cook5分钟后失效
开发场景:常用于登录和保存用户最近浏览商品
第一次访问网站,请求cookLogin.aspx页面,服务器将页面的执行结果(html+css+js)发回到浏览器。浏览器翻译执行html+css+js,用户看到界面。
第二次当用户点击登录按钮,将用户名密码提交到服务器后,服务器验证通过,并讲用户ID存入一个Cookie对象,最后将Cookie对象随响应信息一同发回浏览器。浏览器根据情况储存cookie文本。
第三次当用户访问该网站任何页面时,浏览器会自动根据域名将cookie信息一同发往服务器。(注意:浏览器自动完成此操作)
服务器设置Cookie:
HttpCookie cok = new HttpCookie(“uId”, “10001”);//(“键”,”值”) cok.Expires = DateTime.Now.AddDays(18);//设置失效日期-现在之后的18天后 context.Response.Cookies.Add(cok); //添加到响应中
服务器获得客户端传来的Cookie:
string strUName=context.Request.Cookies[“uId”].Value;//从请求中获得Cookie
* 服务器向浏览器写出Cookie实际上就是在 响应报文中 生成响应行:
* Set-Cookie: uinfo2=123; expires=Mon, 06-Jun-2011 06:48:47 GMT; path=/
* 浏览器读取此 响应行后 会自动在客户端硬盘中产生一个Cookie文件,名为:
* Cookie:[email protected]/,注意@后的 localhoust/ ,实际上是颁发此Cookie网站的域名;
* 当浏览器下次再访问此域名时,就会自动将 后缀为 localhoust/ 的cookie文件内容发送到服务器。
1.普通GET请求:无Cookie
2.服务器通过响应报文头里的set-cookie向浏览器设置Cookie信息
3.浏览器通过请求报文头里的Cookie传递浏览器存储的Cookie信息
1、服务器通过响应报文头里的set-cookie发送给浏览器以后,在浏览器端建立cookie
文件
2、再次请求该网站时,会将cookie文件中的内容自动向该网站发送
如果服务器两次都输出同一个名称的Cookie,浏览器会怎么办?//覆盖相同的key值
如果服务器输出两个不同名的Cookie,浏览器怎么办?//都追加到cookie文本中
如何删除浏览器Cookie?//在cookie文件中右击删除,到期删除,改到期的时间cookie.Expries=datetime.now.addays(-1)改为昨天
Cookie的缺点和表单一样,而且还不能存储过多信息。客户端、服务器端设置的Cookie双方都能读,不安全,会丢失和更改
Session:保持用户与服务器网站的会话状态。
一个用户一个session,一个sessionid,
Session:在服务端有一个Session池,专门用来存储Session(服务端)
用户登录后,为用户创建一个session(键值对)(由于保存用户名等相关信息),由于有多个用户登录,多个session,
那么为了对Session进行区分,给每个存储单元编号,然后将编号sessionid返回给浏览器(通过cookie的形式),并将sessionid保存到浏览器的
的内存中(以cookie的形式保存:此时浏览器关闭后cookie丢失,sessionid也会丢失),
下次浏览器访问的时候带着这个编号(请求报文中带着该sessionid)(登录后访问该网站的其他任何网页都会带着一个sessionid),
然后在请求的页面中(服务器)根据该sessionid从session池中取出相应的内容(一般在页面开头判断if(Session["name"]=null,非法用户,请先登录
否则显示欢迎用户:Session["name"].tostring();
Session对象在服务器的session池中默认存储20分钟
当浏览器中20分钟内没有向服务器发出任何的get或post请求,服务器就在session池回收清除该session对象,主要为了安全考虑。
//但是有时候为了提高用户体验度,为了解决这个问题,一般在浏览器端采用每隔一段时间自动刷新,去再次请求服务器。
可以在web.confi文件中更改存储时间:设置为30分钟,如果在开发环境中会使该session过期,部署后就不会再去做更改了
在<system.web>
<sessionState timeout="30"></sessionState>
</system.web>
如果用户登录后(此时是可以访问管理员界面的),但是如果此时关闭浏览器,然后再去直接访问管理员界面,是不允许的,因为
此时在服务器的session池中虽然还存在该用户的sessionid,但是浏览器端的sessionid是存储在浏览器的内存中,如果关闭了浏览器,sessionid就
丢失了,sessionid就丢失了,此时打开新的浏览器中没有保存上次的浏览器的sessionid,所以在服务器端就无法再根据该sessionid到session池中找到该用户的session了,此时session的值为空,非法用户
一句话:没有登录就不能访问其他网页,登录后,把浏览器关闭,再去请求其他网页也是不行的。
问题:那如果像京东商城,我登录后,点击链接打开了购物网页,然后关闭了刚登录进来的主网面,此时进行后续操,比如购物付款,作会不会要求重新登录
应该不会,因为登录后,点击链接打开了购物网页,会重新向服务器发送请求,并把sessionid传递过去,此时其他网页,不影响这个页面的sessionid,
服务器就可以根据该sessionid获取该session对象,而不会是非法的,只有整个这个网站的浏览器关闭后,再去请求其他网页是非法的
因为session保存在服务端的内存中,所以尽量不要的使用session,会造成服务器内存的消耗和压力
Cookie是存在客户端,Session是存在服务器端,目的是一样的:保存和当前客户端相关的数据(
当前网站的任何一个页面都能取到Session、Cookie)。
不能放太大的数据,放的数据是object。如果浏览器禁用了Cookie可以启用Url来传递SessionID。
session和cooike的区别:
1、session常用于保存用户登录的ID及用户名等相关信息,在其他页面判断是否非法,保存在服务器端的内存中,较安全
2、cookie常用于登录(记住我:保存cooike,自动登录)和保存用户最近浏览商品(购物车),不是很安全。
cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE
4、单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
Session的操作:
开始并为Session赋值:
Session[“uName”]=“CNYaoMing”;
取值:
string strName = Session[“uName”].ToString();
销毁(取消/退出):常用于点击退出按钮,然后销毁session,返回登录界面,重新登录
Session.Abandon();//销毁服务器端的Session对象
Session.Clear();//清空服务端的Session对象里的键值对,Session对象并没有从Session池里销毁
Session详解:
ASP.Net已经内置了Session机制。不要放太多的对象到Session(因为存储在服务器端fw的一个辅助进程里,不稳定,数据多了容易丢失。),
Session会有超时销毁的机制,发帖(服务器不可能知道浏览器是否在开着,什么时候关闭),发帖计时,在线时间统计,靠请求来判断是否活着。
Cookie是存在客户端,Session是存在服务器端,目的是一样的:保存和当前客户端相关的数据(当前网站的任何一个页面都能取到Session、Cookie)。
不能放太大的数据,放的数据是object。如果浏览器禁用了Cookie可以启用Url来传递SessionID。
可以看到Session机制并不是Http协议规定的,是ASP.net实现的,现在PHP、JSP等大部分服务端技术都实现了Session,原理都差不多。
Session有自动销毁机制(设置失效时间,默认就是滑动过期机制),如果一段时间内浏览器没有和服务器发生任何的交互,则Session会定时销毁。
案例:Session实现登录,登录以后才能看一些内容。
案例:用Session实现验证码。HttpHandler要能够操作Session,要实现IRequiresSessionState接口。为什么每次点击值都变化?很正常,
因为每次页面点击页面都会刷新,就向ashx重新请求图片,ashx的ProcessRequest都会执行。正常网站登录成功就进入主页面,没机会让你看到变化,但是一旦输入错误也是变化。
点击图片产生新的验证码。 <img src=“YZM.ashx” onclick=“this.src=‘YZM.ashx?aaa=’+new Date()” />每次点击都生成一个新的地址,让浏览器去请求。在AJAX中还会用。
问题:为什么页面中能显示验证码的图片。用“动态绘制趣味图片”的例子讲解。
Session深入 -状态提供程序 :
保存session 的4种方式:
1、存储在cookie中,但是不安全,被篡改,容易丢失
1、aspnet_wp.exe(w3wp.exe):进程内 nProc(进程内)-默认就是这种-速度快/但内存小/易丢失
2、aspnet_state.exe 进程外,存储在aspnet_state进程中
可以在IIS或ASPNET服务意外关闭时继续保持状态,注意此时存储到session中的对象必须支持序列化:
2.1修改配置文件: 2.2<sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424"/>
设置是否允许远程使用,位置:C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters
2.3默认端口号:42424
2.4开启服务:我的电脑-管理-服务与应用程序-服务-ASP.NET State Service(ASP.NET 状态服务)
3、存储在sqlserver数据库中:安全,但是效率低,往返
新建ASPSTATE数据库使用运行Session数据库脚本: 临时储存区:InstallSqlState.sql & UninstallSqlState.sql
永久储存区:InstallPersistSqlState.sql & UninstallPersistSqlState.sql(需要使用SQLServerAgent服务-因为调度作业)
注意:之后配置数据库权限麻烦的话,可以在运行完aspnet_regsql.exe后在数据库中执行你想要使用的sql脚本,就可以不配置权限了。
AJAX:异步javascrip+xml
本质上是一个浏览器的的技术
主要是用于提高用户的体验度
"content_type","application/x-www-from-urlencoded"指定post发送数据的格式,name=zhang&pwd=212,键值对的形式
在web.config中<appSettings><add key="pageSize" value="3"></appSettings>
读取:ConfigurationManager.AppSettins["pageSize"]
常用的服务段控件一般都要放在 <form id="form" runat="server">属性中 但是如repeate控件则不会
不是控件本身的属性会原样输出到浏览器 textbox 的onmouseover的属性
一般服务器控件的id与生成的html标签id是一样的,同时会生成一个name
属性名字与id相同
repeater控件中textbox 的id是不一样的,repeater控件中textbox 中的id会重复递增
Textbox1.ClientID来获取服务端的控件id document.getElemnetById(‘<%#"txtName.CilentID"%>‘)
$("#<%=txtSearch.ClientID%>")
CssClass对应class
属性:
textbox1.Attributes.Add("onmouseover"); textbox1.Attributes["onmouseover"]=alert(‘nihao‘); xtxtbox1.Attributes.add("onclick","alert(‘你好啊‘)")
label控件:
AssociatedControlID="radio" 关联一个控件相当于客户端的label for="radio1"
Literal,把text值原样输出
textbox的TextChanged()方法,必须设置 AutoPostBack="true",客户端会生成一段js代码提交表单
radioButton 通过GroupName进行分组
button:
OnClientClick:客户端的事件,先执行,然后在执行服务端的OnClick
服务端:ImageUrl="~/img/mm.jpg"//跟目录下的,等于客户端:<img src="img/mm.jpg"
button:客户端:submit
linkbutton:客户端:<a href=‘javascrippt:(提交函数)‘></a>
FileUpload,文件上传
if(!IsPostBack) { this.dropDownList.Datasource=BLL.getAll(); this.dropDownList.DataTextField="CName"; this.dropDownList.DataValueField="CID" this.dropDownList.DataBing(); }
第一次get请求的时候会把值保存到客户端的__viewstate中
下一次提交的时候直接从隐藏域中发送过来,因为if(!IsPostBack)后并没有再去读数据库中的值
如果禁用页面的__viewstate就没有值,就提取不到值了
DropDownList原有“请选择性别”和数据绑定项的共存:
AppendDataBoundItems=“true”,把数据绑定的项加到后面。
dropDownList的selectedindexchanged事件,要设置DropDownList的AutoPostBack的属性为true
设置:DataTextField="CName",DataValueField="CID"
Repeater控件主要用于显示数据的,也可以做一些简单的其他操作
Repeater(foreach)用于对绑定数据源中的数据进行遍历并按格式显示,每条数据以什么格式显示是由Repeater的<ItemTemplate>来决定的,模板会多次显示,就像foreach, ItemTemplate 中相当于{}中的语句。<ItemTemplate>姓名:<%#Eval(“Name”)%><b>年龄:<%#Eval(“Age”)%></b><br /></ItemTemplate>。注意:%和#中间不能有空格。
<%#Eval("Name")%>表示在这个位置显示当前实体对象的Name属性,注意调用Eval、Bind这些数据绑定方法的时候要用#。
因为Eval就是将属性显示到指定的位置,因此也可以显示到文本框中<ItemTemplate>姓名: <asp:TextBox runat="server" Text=‘<%#Eval("Name") %>‘ /> </ItemTemplate>
注意不要写成Text="<%#Eval(‘Name‘) %>" 因为<%%>中的是C#代码,‘‘是字符,而不是字符串
还可以用在服务器控件中<asp:TextBox Text=‘<%#Eval("Name") %>‘ runat="server"></asp:TextBox>
1、<AlternatingItemTemplate>,设置隔行的不同显示风格,如果设定<AlternatingItemTemplate>,则奇数行用<ItemTemplate>模板,偶数行用<AlternatingItemTemplate>模板
<AlternatingItemTemplate><asp:TextBox BackColor="Red" ID="TextBox2" Text=‘<%#Eval("Name") %>‘ runat="server"/></AlternatingItemTemplate> 。设置隔行变色是为了防止数据太多看串行。
2、HeaderTemplate、FooterTemplate:头部、尾部的模板,分别显示在所有数据的前面和后面。
3、SeparatorTemplate :两项数据之间的分隔符,比如换行符
1、<AlternatingItemTemplate>,设置隔行的不同显示风格,如果设定<AlternatingItemTemplate>,则奇数行用<ItemTemplate>模板,偶数行用<AlternatingItemTemplate>模板
交替项模板的内容与<ItemTemplate>中的内容是一样的,<ItemTemplate>的内容是必须要有的
因为Eval就是将属性显示到指定的位置,因此也可以显示到文本框中<ItemTemplate>姓名: <asp:TextBox runat="server" Text=‘<%#Eval("Name") %>‘ /> </ItemTemplate>
注意不要写成Text="<%#Eval(‘Name‘) %>" 因为<%%>中的是C#代码,‘‘是字符,而不是字符串
外面的属性用单引号,里面的绑定内容属性字段用双引号
<input type="text" value=‘<%#Eval("CName")%>‘/>
如果只是想显示数据,可以不加if(!IsPostBack)。每次从数据中提取
为控件添加一个,在头属性中DataKeyNames=cid,根据cid来删除
在ItemTemplate中OnClientClick="return confirm("确定要删除吗?");"
显示图片:<asp:Repeater ID="Repeater1" runat="server" DataSourceID="ObjectDataSource1">
<HeaderTemplate><table><tr id="trPics"></HeaderTemplate>
<ItemTemplate><td><img width="150" height="100" src=‘images/<%#Eval("PicPath") %>‘ /></td></ItemTemplate>
<FooterTemplate></tr></table></FooterTemplate>
</asp:Repeater>
ItemCommand:
可以在模板中放置Button控件(Button、LinkButton、ImageButton),模板中的按钮一般不写OnClick事件响应,而是响应Repeater的ItemCommand事件。
为Button控件设定CommandName、CommandArgument属性,然后在ItemDataBound事件读取e的CommandName、CommandArgument属性就可以获得发生事件的命令和行参数了。如果对数据进行了操作,则需要Repeater1.DataBind()来重新绑定,从数据库中刷新最新的数据。
DataPager PageSize="6" 分页显示的记录数
分页的显示方式 数字分页
数字显示放中间 前面第一页="true",上一页="true" ,1,2,3,后面下一页,最后一页
ListView 控件:
<LayoutTemplate>布局模板
项占位符:<tr ID="itemPlaceholder" runat="server">//所有的ItemTemplate内容都放在项占位符中
纯html时:添加用隐藏域,然后取隐藏域的值来判断是否回发
服务端控件:直接通过页面的__viewstate 然后if(!IsPostBack)来断定是否回发
PageLoad事件:先执行执行母版页master后执行子页Aspx
Textbox txt=this.Master.FindControl("txtbox1") as TexBox;
txt.text="给母板页的textbox控件赋值";
母版页的image标签,aspx页赋值后,浏览器请求的是master的地址,所以要转成相对路径:
路径前面加img.ImageUrl="~/img/mm.jpg" 在根目录web下面找
用户访问多,更新的频率少
空间(占据内存)换时间(提高访问速度)
缓存依赖
缓存丢失:
服务器关闭、IIS服务关闭
移除缓存Cache.remove();
设置了缓存的失效时间
缓存依赖更新
if(Cache["key"]=null) { list=bll.getall(); Cache["key"]=list; } else { list=Cache["key"] as List<Classes>; response.write("从缓存中读取"); } foreach(classes cla in list) { response.write(cla.Cname); }
//采用绝对过期时间
Cache.Insert("key",list,null,datatime.now.addSeconds(10),Cache.NoSlidingExpiration)//第3个参数为缓存依赖项,第5个参数最后一个参数去掉缓存滑动时间
给页面添加<%@Cache>
ASP.net缓存主要分为:页面缓存(中庸)、数据源缓存(最不灵活的)、自定义数据缓存(灵活)这三种主要类型。
1、页面缓存
给页面添加<%@ OutputCache Duration=“15” VaryByParam=“none”%>标签
尽管id变了,也还是直接读取缓存的页面
如果<%@ OutputCache Duration=“15” VaryByParam=“id”%>标签,则访问的相同的id时,读取缓存,不同id读取新的内容
如果<%@ OutputCache Duration=“15” VaryByParam=“*”%>根据请求url的不同字符串,来缓存,相同的时候直接读取缓存
2、数据源缓存:
设定ObjectDataSource的CacheDuration(缓存时间:秒),EnableCaching=true。
这样每隔CacheDuration指定的时间段才调用SelectMethod指定的方法来执行数据库查询,
其他时候都是直接返回缓存的数据。取数据的过程缓存,在缓存期间,
绑定控件向ObjectDataSource要数据, ObjectDataSource直接将缓存的数据返回给控件,
不再去向TypeName指向的类要数据。
而不是缓存页面(页面内容会变),而是缓存控件的SelectMethod指定的方法调用的数据
缓存依赖:
1、文件缓存依赖:当文件内容发生改变的时候,尽管缓存时间还没到,也会读取新的内容,而不是读取缓存
Cache.Insert("key",list,cb,datatime.now.addSeconds(10),Cache.NoSlidingExpiration,Cache.)//第3个参数为缓存依赖项
,第5个参数最后一个参数去掉缓存滑动时间
2、数据库缓存依赖:表中数据一修改,就会在触发触发器,把刚刚生成的另一张表中的changeid加1
只要一修改,缓存就会失效,尽管缓存失效时间还没到
DataList控件:+objectdatasource控件:
首先在一个页面根据get传值,根据id来显示记录的信息详细
在bll层有个方法:
绑定bll层中的根据id查找记录的方法,在定义参数的步骤中
参数源选择<asp:QueryStringParameter DefaultValue="1" Name="cid" QueryStringField="id"
服务端的缓存和客户端的缓存的 区别:
IIS版本:
xp:iis5.0,5.1
server2003:iis6.0
windows7:iis7.0
在vs2010的命令提示工具中输入:
aspnet_regiis -i
图片的文件夹,属性,执行权限:无
发布网站的时候,勾选取消编译,所有cs文件,全部转换为bin下的dll
网站的meta的作用:
对网站的描述
关键字搜索
编码:gb2312,如果出现乱码,改为utf-8
SEO的优化:
网站根目录下的robots.txt文件:是一个协议和公约告诉蜘蛛程序中服务器上拿些文件可以被查看
是搜索引擎中访问网站的时候要查看的额第一个文件
不希望被搜索引擎搜索的内容,在需要使用该文件
如果希望搜索引擎收录网站的所有内容,请勿建立该文件
尽量使用get,不要使用js、post来进行页面导航,不要使用ajax动态生成的内容,蜘蛛程序爬不到
不要使用linkButton,因为使用的是javascript脚本就行导航
页面连接到本身
<a herf="javascript:void(0)" id="one">连接</a> <a herf="#">连接</a> <a herf="return false">连接</a> /ashx/Seo.ashx?id=1 $(function(){ $("#one").click(){ } }) href="/ashx/Seo.ashx?id=1" Jquery中图片的css的url $("#img").css("backgroundImage","url("+path+")");
单元测试:在方法上右击,创建单元测试,选择方法,给实际值与期望值赋值,点击调试当前上下文的测试按钮
然后运行期望值与实际值是否相同,相同的话通过
用户控件:网页当中常用的元素放在用户控件中
masterpage与用户控件的区别:
masterpage应用于网页的布局,位置固定
用户控件:可以应用到页面的任何位置
方法的重载 Eval占位符
<%#Eval("ISBN","/Images/books/{0}.jpg")%>;
截取字符串,超过用...代替
protect string CutString(string str,int len) { if(str.length>len) { return str.substring(0,len)+"...."; } else{ return str; } }
获取图片的时候要获取物理路径:Image oldImage=Image.FromFile(context.Server.MapPath(imgSrc))
保存图片的时候: map.Save(context.Server.MapPath("/UploadFile/CutImages/" + fileName+".jpg"));
使用viewstate和IsPosrBack关联,第一次get,IsPosrBack为false,post的时候(有数据的时候)为true
禁用ViewState时候,页面全是html控件时,不能使用viewstate
除非手动加个名称叫__ViewState的隐藏域,此时就可以传值到服务器
禁用ViewState时候,页面也会生成名称叫__ViewState的我隐藏域,也可以用IsPostBac去判断,都是数据会丢失
.cs文件中跨方法调用的变量
不能用全局变量
使用页面自带的ViewSate
使用自己添加的隐藏域
使用url参数传值
"datetime",{0:yyyY-MM-dd}//时间格式
"price",{0:0.00}//小数的格式
datetime.tostring("yyyyMMddHHmmssfff");加毫秒
<%#Eval("PublishDate","{0:yyyy-MM-dd}")%>//时间格式
Eval数据绑定的格式化
<a href=‘<%#Eval("Id","BookDetail.aspx?id={0}")%>‘></a> <a href=‘<%#Eval("Id","BookDetail.aspx?id={0}")%>‘><IMG style="CURSOR: hand" height="121" alt=‘<%#Eval("Title")%>‘ hspace="4" src=‘<%#Eval("ISBN","/Images/BookCovers/{0}.jpg")%>‘ width="95"></a> <a class="booktitle" id="link_prd_name" href=‘<%#GetDateDir(Eval("PublishDate")) %><%#Eval("Id") %>.html‘ target="_blank" name="link_prd_name"> <%#Eval("Title") %></a> href=‘<%#GetDateDir(Eval("PublishDate"))%><%#Eval("Id")%>.html‘ string.Format(<a herf=?page{0}> [{0}] </a>,i)
当控件在哪个页面时,href=就连接到哪个页面
onpageload的事件的执行循序:
先执行本页aspx-》母版页-》用户控件
可以在用户控件中获取aspx页面的传的值
先执行(aspx,母版页,用户控件的)pageload,再执行aspx页的按钮单击事件的方法
url重写:提高seo优化
URL="booklist.aspx?categoryId="+model.id;
把url:booklist_"+model.Id+".aspx";
在请求管道中的事件处理中重写成"booklist.aspx?categoryId="+model.id;
用正则表达式进行匹配判断是不是相同类型的页面,如果是就重写,并交给重写后页面进行处理
1、重写成HTML时--IIS配置中让HTML也走动态生成的--那还不如直接生成静态页2、
2、config进行配置下,哪个网页可以直接返回给浏览器
重写url请求的action属性:
在应用程序中添加一个App_Browsers文件夹,然后再文件夹里面添加一个浏览器的文件
Browsers元素:浏览器定义文件架构,包含各个浏览器的定义
首先通过浏览器的请求报文中获取请求浏览器的类型
然后ASP.NET使用.Browsers文件来确定浏览器的功能
ASP.NET控件适配器可以使用此信息来适应ASP.NET WEB服务器
控件行为,具体取决于该设备的类型。可以改写浏览器上显示的元素的属性
静态页:经常被访问,很少被修改的页面(图书列表)做成静态页
降低数据库和服务区的压力
CMS:内容管理系统,它具有很多机遇模板的优秀设计,可以加快网站的开发数度和减少开发的成本
可以处理文本,图片,flash动画,声像,图像,电子邮件档案
从一般的博客,新闻发布系统,综合的网站管理程序都可以被称为内容管理系统
discuz社区论坛管理系统
RSS订阅:
是一种描述和同步网站内容的格式, RSS目前广泛用于网上新闻频道,
blog和wiki,主要的版本有0.91, 1.0, 2.0。使用RSS订阅能更快地获取信息,
网站提供RSS输出,有利于让用户获取网站内容的最新更新。
网络用户可以在客户端借助于支持RSS的聚合工具软件,
在不打开网站内容页面的情况下阅读支持RSS输出的网站内容
注意:已xml的头文件开头
<![CDATA[<%#Eval("Title")%>]]>
为了防止内容中包含<br>等一些xml无法解析的
或冲突的符号,得加注释标记![CDATA["内容"]]
解决模糊查询解决方案:
luncene.net收索引擎,关键字模糊找查询优化效率
textera 一定要设置rows和cols
CKEditor:编辑器:评论提交文本
CKFinder:图片上传的工具,有bug,用自己写的无刷新上传文件的功能
XSS:跨站脚本攻击
是一种经常出现在web应用中的计算机安全漏洞
它允许恶意的web用户将代码植入到提供的给其他用户使用的页面中,包含html代码和客户端脚本
评论的时候插入了一段js或html代码,也可以提交成功,就是存在安全漏洞
UBB编辑器
[b]123[/b]替换为<b>123</b>
将uub编码替换成html编码
string reg="[{\w}]{\w+}[{\w}]";
Regex.replace(str,reg,"<$1>$2<$3>")
//评论时把<>替换
msg.replace(">",">").replace("<","<")
<script>alert(‘213131‘)</script>//替换<>
//采用UBB编辑器,避免xss跨站脚本攻击,把用户输入的<>等有危险的符号替换成"><"然后输出到浏览器
//编辑器自己输入的输入的内容,保存到数据库中的[a]nihao[/a]是这种类型的,所有显示到浏览器的时候要用html标记<a></a>来替换它们
视频转码:
视频上传:
在一个文件夹中加一个App.config
配置文件的就近原则
ORM的全称是Object Relational Mapping,即对象关系映射。它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,
并通过面向对象(Object-Oriented)的方式将这些对象组织起来,实现系统业务逻辑的过程。在ORM过程中最重要的概念是映射(Mapping),
\通过这种映射可以使业务对象与数据库分离。从面向对象来说,数据库不应该和业务逻辑绑定到一起,
ORM则起到这样的分离作用,使数据库层透明,开发人员真正的面向对象。
Json: