•实现input的自增:点击按钮input中的值自动增加,代码见备注。点击刷新就一直是值不变,只有点击提交才会变,分析原理。用开发人员工具篡改文本框的值自增就从新的值开始了。
1 <%@ WebHandler Language="C#" Class="Handler3" %> 2 3 using System; 4 using System.Web; 5 6 public class Handler3 : IHttpHandler { 7 int a = 0; 8 public void ProcessRequest (HttpContext context) { 9 10 if (!string.IsNullOrEmpty(context.Request.Form["IsPostBack"])) 11 { 12 string txtNum = context.Request.Form["txtNum"]; 13 int.TryParse(txtNum,out a); 14 } 15 //string Num = context.Request.Form["txtNum"]; 16 //int.TryParse(Num, out a); 17 a = a + 1; 18 context.Response.Write("<form action='' method='post' ><input type='text' name='txtNum' value='"+a.ToString()+"' /><input type= 'hidden' name='IsPostBack' value='1' /><input type='submit' value='提交' /></form>"); 19 20 } 21 22 public bool IsReusable { 23 get { 24 return false; 25 } 26 } 27 28 }
1 input自增 2 <form action="Input自增.ashx"> 3 <input type="hidden" name="ispostback" value="true" /> 4 <input type="text" name="value" value="@value" /><input type="submit" value="增加" /> 5 </form> 6 string ispostback = context.Request["ispostback"]; 7 string value = "1"; 8 if (ispostback == "true") 9 { 10 value = context.Request["value"]; 11 value = (Convert.ToInt32(value) + 1).ToString(); 12 } 13 string filename = HttpContext.Current.Request.MapPath("/1/Input自增.htm"); 14 string s = File.ReadAllText(filename); 15 s = s.Replace("@value", value); 16 context.Response.Write(s);
•使用aspx重写input的自增。
•练习:加法计算器。常见错误:把htm设置成了起始页。type=submit才会自动提交表单,type=button不会自动提交。从ashx启动和从htm启动的区别
•为什么单使用div在服务器取不出来值呢?因为不是服务器来读取客户的网页,而是浏览器收集客户在表单中输入的字段,然后形成请求参数发给服务器处理程序,由于没有把div当前的innerText发给服务器,所以服务器无法得知当前的值。也不要幻想有办法能将div的innerText提交给服务器,因为只有设定了name的input、textarea、select的value属性值才会被提交给服务器。
•实现div内文本的自增。因为服务器不记得上次给浏览器的值是什么,而且不像input那样会将上次的值重新提交回来,因此浏览器需要用一个隐藏字段将上一次的值保存下来。
1 div自增 2 <form action="Div自增.ashx"> 3 <input type="hidden" name="ispostback" value="true" /> 4 <input type="hidden" name="value" value="@value" /> 5 <div>@value</div><input type="submit" value="增加" /> 6 </form> 7 服务端代码几乎和实现input的自增一样。
•http无状态,每次请求都是由一个新的DivAutoInc对象来处理请求。如果把value搞成static可以实现,但是两个用户访问的话就会串了。而用Input方式的话两个人各自点各自的,不会互相影响。
•非表单元素无法将客户端的元素值传递给服务器端,即使是表单元素也只能传递value值,对于其他属性值比如背景颜色、大小等也是无法传递的,因此对于这些值都要存在隐藏字段中。这就是ASP.Net中ViewState的实现原理。
•其实div中的只是起到显示作用而已,使用IE的“开发人员工具”修改div的innerText,然后点击按钮发现值并没有按照我们修改以后的递增。而修改input版本的则有效果。