当我们直接从服务端读取网页时,表时此网页并没有post(提交),当用户再次提交表单时,就会把此网页的相关参数传给服务器处理,对于服务器来说就是一个postback(提交返回),即提交回来了。这就是postback.
在网页开发时这个很重要,用户第一次加载时就不是postback,当用户把相同的网页提交给服务端时就是postback.
我们建立如下测试程序,先建一个模板,即一个带form的表单,它里面放上一个textbox和一个submit按钮。当点击按钮时会把textbox的值传给服务端的程序来处理,服务端根据是第一次加载还是再次提交返回给用户,当然服务端会把此模板返回回来。
注意模块是不直显示的,即我们在网页打开时是直接打开这个处理程序的网址,它会加载模板,然后会根据模板中返回的信息再提交给客户端,好像同一个页面一样。
1.模板
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> </head> <form action="HandlerHello1.ashx" method="post"> <body> <input type="hidden" name="ispostback" value="true" /> 姓名:<input type="text" name="UserName" value="@value" /> <br /> <input type="submit" name="vvv" value="提交" /> <br /> @msg </body> </form> </html>
为什么用到hidden元素,就是为了表明是不是postback,只有带name属性的元素才能提交给服务端。当第一次加载时不会提交这些元素,因为是直接从HandlerHello1.ashx加载的,此时hidden的value是不存在的。当用户提交时会会传递这个值 ,这时服务端会知道是postback.
2.建立服务端
<%@ WebHandler Language="C#" Class="HandlerHello1" %> using System; using System.Web; public class HandlerHello1 : IHttpHandler { public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/html"; string postback = context.Request["ispostback"]; string username=context.Request["UserName"]; string msg=""; if(postback=="true") { context.Response.Write("提交进入"); msg="欢迎:"+username; }else { context.Response.Write("直接进入"); username = ""; @msg=""; } string s=context.Request["vvv"]; if (!string.IsNullOrEmpty(s)) { @msg=s; } //读取hello1.html string constr = System.IO.File.ReadAllText(context.Server.MapPath("Hello1.htm")); constr=constr.Replace("@value", username); //替换文本框中的内容 constr = constr.Replace("@msg",msg); //替换@msg内容 context.Response.Write(constr); } public bool IsReusable { get { return false; } } }
替换过的内容好像是用户的网页没有动过一样。其实是服务端又提交了一份完整的copy.