现在的位置: 首页 > 综合 > 正文

.Net IsPostback的原理

2018年09月26日 ⁄ 综合 ⁄ 共 3752字 ⁄ 字号 评论关闭

转载地址: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,现在的结果是我们想要的结果了,具体的结果如下:

选中国后,结果:

 

选日本后,结果:

 

选择美国后,结果:

 

      


抱歉!评论已关闭.