您的位置:首页 > 其它

.Net IsPostback的原理

2014-08-21 18:22 363 查看
转载地址:http://www.cnblogs.com/knowledgesea/archive/2012/05/30/2524994.html

ispostback:就是判断页面是首次加载的,还是数据回发(有get或者post请求过的)后的页面。上代码吧,直观点。

<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Button" />
</div>
</form>
</body>


protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
Response.Write("这是回发后的页面!"); //点击button1控件后出现这个
}
else
{
Response.Write("这是首次加载的页面!"); //第一次预览出现这个
}
}


2.html页面

(1)由于是纯粹的html页面,即便点击提交也无法,回发数据,也就是html页面无法获取回发过来的值。所以ispostback为false。

<form action="WebForm1.aspx" method="post">
<input id="Submit1" type="submit" value="submit" />
</form>


protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
Response.Write("这是回发后的页面!");
}
else
{
Response.Write("这是首次加载的页面!"); //第一次预览出现这个,点击submit控件后还出现这个
}
}


(2)这里加了一个隐藏的viewstate,回发过来的数据存放在viewstate,完成了数据回发,ispostback的值也就为true。如果你疑惑如果下次还想要首次加载的数据怎么办,我告诉你,下次读取数据直接从viewstate中读取,不用再次发出请求。

<form action="WebForm1.aspx" method="post">
<input type="hidden" name="__viewstate" />
<input id="Submit1" type="submit" value="submit" />
</form>


protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
Response.Write("这是回发后的页面!"); //点击submit控件后又出现这个。
}
else
{
Response.Write("这是首次加载的页面!"); //第一次预览出现这个。
}
}


小结:其是asp.net页面中也有一个隐藏的viewstate字段,通过在页面上查看源代码就能看出来,一般为了减少服务器的压力,我们通常会把viewstate禁用掉,那么将不会用到ispostback判断是否是数据回发过的页面,那将每次执行以下后台代码,如果是读取数据库中的数据,那么也将每次都要读取一下,这里你可能会担心数据库的压力过大,这里我们还有另外的解决办法,而并非使用viewstate,那就是使用缓存技术解决这里的问题。

某一天在网上看到有人写了这样一段代码:

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

DropDownList1.AutoPostBack = true;

}

ArrayList address = new ArrayList();

address.Add("美国");

address.Add("中国");

address.Add("日本");

DropDownList1.DataSource = address;

DropDownList1.DataBind();

}

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)

{

switch(DropDownList1.SelectedValue)

{

case "中国":

{

ArrayList china_address = new ArrayList();

china_address.Add("湖南");

china_address.Add("广东");

china_address.Add("广西");

DropDownList2.DataSource = china_address;

DropDownList2.DataBind();

break;

}

case "美国":

{

ArrayList american_address = new ArrayList();

american_address.Add("洛杉矶");

american_address.Add("圣安德列斯");

DropDownList2.DataSource = american_address;

DropDownList2.DataBind();

break;

}

case "日本":

{

ArrayList japan_address = new ArrayList();

japan_address.Add("神户");

japan_address.Add("大板");

DropDownList2.DataSource = japan_address;

DropDownList2.DataBind();

break;

}

}

}

然后,就出问题了。

第一次打开页面结果如:



然后选择中国,结果如:



选择日本呢?结果仍然是:



这个问题的所在,就是那个提问的人没有搞明白IsPostBack的概念,这也许是很多初学者容易混淆的一个概念。对于下拉菜单里的数据只需第一次加载页面程序时绑定就可以。象上边的例子写在If(!IsPostBack)代码块外边,这样,每次服务器响应客户端回发时都会重新绑定数据源,因此也就会出现上边的错误结果。

查查msdn,上边有IsPostBack的定义:获取一个值,该值指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问。如果是为响应客户端回发而加载该页,则为 true;否则为 false。

“为相应客户端回发而加载”,注意,这里的客户端的回发是指服务器端响应客户端的回发,这也就决定了该属性是由服务器控件的事件所引起。 对于javascript客户端脚本代码,由于只是运行在客户端,从而执引发不了该属性的执行。

因此上边的例子,我们将代码:

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

DropDownList1.AutoPostBack = true;

}

ArrayList address = new ArrayList();

address.Add("美国");

address.Add("中国");

address.Add("日本");

DropDownList1.DataSource = address;

DropDownList1.DataBind();

}

改为:

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

DropDownList1.AutoPostBack = true;

ArrayList address = new ArrayList();

address.Add("美国");

address.Add("中国");

address.Add("日本");

DropDownList1.DataSource = address;

DropDownList1.DataBind();

}

}

ok,现在的结果是我们想要的结果了,具体的结果如下:

选中国后,结果:



选日本后,结果:



选择美国后,结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: