ASP.NET初级学习
1. ASP.Net简介及学习
1. 什么是ASP.Net –ASP.Net是一种动态网页技术,在服务器端运行.Net代码,动态生成HTML。可以使用JavaScript、Dom在浏览器端完成很多工作。
学习ASP.NET不要陷入如何使用服务器控件的误区中,我们要懂得每个控件的运行原理。不要做一个只会拖控件的“程序员”。
2. webApplication 和webSite的区别。
WebApplication 有命名空间,更改c#代码后要重新启动浏览器方能看到更改的效果。webSite则没有这个东东。
webSite是由ASP带过来的程序开发习惯,但是它只适用于小型网站的开发,因为代码出错了不容易发现,而且所有页面共用一个命名空间,代码不容易管理。讲简单基础知识时使用webSite,讲高级技术和做大型项目用WebApplication。
3.自己动手写动态网站
提交到服务器的表单元素一定要设置name属性(名字),id是设给Dom和jquery用的,服务只认name。form表单提交到Hello1.ashx页面处理
ashx是一个服务器处理程序,页面form提交到服务器的数据都是调用他来处理,其实aspx也是处理程序,只不过是通过.Net封装之后的处理程序,继承自ashx。
Http是请求、响应的模型,服务器不会来读取浏览器的内容,用户在输出的内容中填入数据,能够得到的就是客户端浏览器提交过来的数据。
4.Get和Post的区别
Get方法传参数,可以在地址栏看到参数,而post传递的表单值隐藏到http报文中,就看不到了
Get传递的数据量是有限的,如果要传递大量的数据,不能有get。Post则没有这个限制;而post会有浏览器提示重新提交表单的问题,而get没有
Get方式URL数据格式,服务器文件名后跟着?,由于客户端可能向服务器端提交多个键值对,键值之间用&进行分割,如果URL中有汉字、特殊字符,则要对url进行编码。
Post方法刷新时,他会提示你是否重新发送信息,不重送信息则无法刷新页面。
5.Input版自增
取得页面提交的数据,在ashx页面上进行处理,然后返回响应值。
6.ViewState初探
查看生成的源代码,ASP.Net将所有隐藏内容统一放到了名字为_WIEWSTATE的隐藏字段个,使用序列化算法将所有隐藏内容放到一个字符串中,点击几次再用ViewStateDecoder这个工具查看viewstate内容,发现了确实将这些改变的内容放到了ViewState中。
Label版本的值存放到了ViewState中,TextBox版本的不存,因为TextBox就是input,自己就会提交给服务器,不需要隐藏字段。
禁用ViewState的方法,禁用控件的ViewState设定enableviewstate=false,禁用整个页面的ViewState在aspx页面源码最上边的Page指令区内加上EnableViewState=”false”.内网系统,互联网的后台可以尽情的用ViewState。
无状态Http:Http协议是无状态的,不会记得上次和网页发生了什么,服务器不记得上次给了浏览器什么,浏览器要记住这些值,(input就放到value中,对于其他的值就要放到隐藏字段中啦,比如ViewState)下次提交时服务器在原来的基础上进行处理。
状态信息保存到隐藏字段中的缺点:加大网站的流量,降低访问速度,机密数据放到表单中会有数据欺骗等安全性问题
Cookie
有时候希望在服务器的任意一个地方存取一些和访问者有关的信息,这时候就不方便将信息保存到表单中了,而Cookie是和站点相关的,并且每次向服务器请求的时候,除了发送表单外,还会将所有和站点有关的Cookie都提交到服务器。服务器返回数据除了普通的html数据外,还会返回修改的Cookie,浏览器把拿到的Cookie值更新到本地浏览器的Cookie就可以了。
网站的优化,大型网站,图片的服务器域名跟网站域名不一样,这样就不会把网站的cookie提交给图片。比如 www.yahoo.com 图片则为:www.yimg.com/a.gif 减少cookie的传输。
Session原理
首先SessionId保存在客户端的cookie中,然后在服务器内存中开辟一块空间放sesion内容。 sessionId为key,Session内容为value的键值对。如下:
private static IDictionary<string, IDictionary<string, object>> data = new Dictionary<string, IDictionary<string, object>>();
因为session本身又是一个键值对,一个sessionId对应的内容可以是多个键值对,比如sessionID为112233 。对应的value又是一个Dictionary。字典名为session。则可以有session[“name”],,sesion[“sex”]等多个值。
不要放太大的对象到Session,Session还会有超时销毁的机制.可以看到,Session不是http协议规定的,是ASP.net实现的。
用Session实现验证码,HttpHandler要能够操作Session,必须要实现IrequiresSessionState接口。
新建一个一般处理程序:
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "image/JPEG";
using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(100, 50))
{
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))
{
/*
g.DrawString("腾讯呀的",new System.Drawing.Font("宋体",18),System.Drawing.Brushes.Red,new System.Drawing.Point(0,0));
bitmap.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);*/
Random rand = new Random();
int code = rand.Next(1000,9999); //动态生成一个验证码
HttpContext.Current.Session["YanZhengMa"] = code; //将验证码保存到Session中
string strCode = code.ToString();
g.DrawString(strCode, new System.Drawing.Font("宋体", 30), System.Drawing.Brushes.Red, new System.Drawing.Point(0, 0)); //画一个验证码图片。
bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
}
<body>
<form id="form1" runat="server">
<div>
<img src="验证码?.ashx" alt="看不清,换一张?" onclick="this.src='验证码?.ashx?aa='+new Date()"/>
</div> <%--向一般处理程序请求一个图片。因为验证图片是由一般处理程序画出来的--%>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="提交" />
</form>
</body>