viewstate在response.redirect上消失

时间:2013-01-20 22:21:44

标签: c# asp.net viewstate

在我的asp.net c#页面上,我有两个带有ajax CalendarExtenders的文本框(开始和结束日期)。用户选择开始日期然后选择结束日期。在选择结束日期时,我绑定我的网格,如下所示;

 protected void calEndDate_TextChanged(object sender, EventArgs e)
    {
        BindGrid();
    }

在网格中,我有一个带有以下代码的命令按钮

 protected void gvAllRoomStatus_RowCommand(object sender, GridViewCommandEventArgs e)
    {    
        if (e.CommandName == "Manage")
        {    
            GridViewRow row = gvAllRoomStatus.Rows[Convert.ToInt16(e.CommandArgument)];    
            int BookingID = Convert.ToInt32(row.Cells[1].Text);              

            DataClassesDataContext context = new DataClassesDataContext();
                Session["BookingID"] = BookingID;
                Response.Redirect("CheckIn.aspx");
        }
    }

当用户转到该页面并单击后退按钮时,所有选定日期和gridview数据都会消失。任何想法为什么观点正在消失?

3 个答案:

答案 0 :(得分:9)

ViewState属于当前Page

看看:http://www.codeproject.com/Articles/37753/Access-ViewState-Across-Pages

  

是的,我们可以跨页面访问视图状态变量。这只是   如果使用跨页面发布或Server.transfer进行重定向,则可能   用户到其他页面。 如果使用Response.redirect,则使用ViewState   不能跨页面访问

因此,您可以使用Server.Transfer代替或使用Session

答案 1 :(得分:1)

Viewstate以非常简单的方式查看它是将其视为您当前所在页面的最后状态的副本或缓存。因此,重定向到任何页面,甚至是同一页面本身,都是一个新的开始。视图状态不再适用于所有意图和目的,您在新页面上。

Tim在帖子中建议,要么将所需数据存储为会话变量,要么使用server.transfer。

在这里查看viewstate的一个很好的概述: http://www.codeproject.com/Articles/37753/Access-ViewState-Across-Pages

答案 2 :(得分:1)

在我看来,您遇到的问题是因为您使用Ajax使用calEndDate_TextChanged进行自动回发。

提交后,当您按下后退按钮时,浏览器无法记住使用Ajax调用的所有自动发布数据都无法保存您所更改的内容,并且您将丢失它们。

对于我,删除文本更改自动回发,删除Ajax,因为您不需要,并在用户提交数据时定期发回完整的回复。

然后当您使用浏览器进行回放时,浏览器会加载以前的状态,并且大多数浏览器会记住用户的所有输入。同样在那个背面,viewstate与之前的相同,因为没有从Ajax进行更改。