1.IsPostBack用来判断表单是否是回发。(不是第一次请求),是点击表单的提交按钮回发过来的。是否是回发与get请求还是Post请求无关。但是一般情况下回发都是Post请求。一般Get请求都是第一次加载。
2.只有当使用服务器端表单<form runat="server">IsPostBack才可以使用。如果使用客户端表单,则IsPostBack永远都是False.因为当使用服务器端表单的时候会自动生成一个隐藏域,才该隐藏域中,服务器写入了一些内容,通过这些内容就可以判断是否是回发。如果使用的是普通html表单,则需要自己写代码来判断是否是回发。
3.IsPostBack的使用方式,为什么要使用IsPostBack
减少数据加载的次数。避免了每次点击按钮回发都重新加载一次数据。
HTML页面
- <html>
- <form action="Page1.aspx">
- <input type="text" name="UserName" value="Jim">
- <input type="submit" value="提交">
- </form>
- </html>
- -------------------------------------------------------------Page1.aspx处理页面(一般处理程序)
- public void ProcessRequest(HttpContext context)
- {
- context.Response.ContentType = "text/html";
-
- string mappath = context.Server.MapPath("Page1.aspx");
-
- string con = System.IO.File.ReadAllText(mappath);
-
- context.Response.Write(con); 将内容写入(画出)到浏览器端
-
-
- string name=context.Request["UserName"];
-
- if (string.IsNullOrEmpty(name))
- {
- context.Response.Write("直接就进入网页了,即用户第一次进入页面。并没有提交表单");
- }
- else
- {
- context.Response.Write("提交表单后,经过处理后进入的网页(也就是说网页是经过提交表单后重新画出来的)");
- }
-
- }
那么现在问题就来了, 每次去取有name 属性的表单的值,以能不能获取到这个值(判断是否为空)来判断用户是否为提交进入页面。这样是有问题的,假如这个有name属性表单的值本身就是允许为空呢? 所以我们这里就添加一个隐藏字段hidden 将他的name 属性设为isPostback ,value值永远设为true(当然你也可以设置其他的值,只要不为空)
这样用户每次提交表单的时候,不管其他有name属性的表单值是否为空,hidden这个表单的值是一定能提交出去,并且能获取到这个值的(因为我已经将hidden表单的值设为一定不能为空) 那么我们就用这个hidden表单的的值是否为空来判断用户是否为提交表单而进入页面(即:用户不是第一次进入页面)
- <html>
- <form action="Page1.aspx">
- <input type="hidden" name="ispostback" value="true">
-
- <input type="text" name="UserName" value="">
- <input type="submit" value="提交">
- </form>
- </html>
-
-
-
-
-
-
- public void ProcessRequest(HttpContext context)
- {
- context.Response.ContentType = "text/html";
-
- string mappath = context.Server.MapPath("Page1.aspx");
-
- string con = System.IO.File.ReadAllText(mappath);
-
- context.Response.Write(con);
-
-
-
- string ispostback=context.Request["ispostback"];
-
-
- if (string.IsNullOrEmpty(ispostback))
- {
- context.Response.Write("直接就进入网页了,并没有提交表单");
- }
- else
- {
- context.Response.Write("提交表单后,经过处理后进入的网页(也就是说网页是经过提交表单后重新画出来的)");
- }
-
-
-
-
-
-
-
-
-
- }
二、解决编辑数据时数据更新的数据原来的,无法修改的问题
解析:因为当后台编辑数据时,先从后台查询出需要编辑的数据,此时是在不是回传的情况下从数据库查询出数据,当编辑完数据之后,点击提交按钮,提交数据,此时如果没有判断是否回传,会再次查询原来的数据,造成编辑数据没有改变。
namespace Example
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) //不是回传即第一次加载页面传过来的值为空
{
}
if (Request.QueryString["id"] != null)
{
Bind();
}
else
{
Response.Write("<script>alert('数据发生改变')</script>");
}
}
public void Bind()
{
Response.Write("数据");
}
protected void button1_Click(object sender, EventArgs e)
{
Response.Redirect("WebForm1.aspx?id=3 ");
//Server.Execute("WebForm2.aspx?id=3");
}
protected void CesH_Click(object sender, EventArgs e)
{
Label1.Text = "测试";
}
}
}