Tuesday, 11 March 2014

Access ViewState Across Pages



ViewState is a very misunderstood. It is said that ViewState is Page specific; that means, it is available only on the same page on which it was created. Once you redirect to another page, the previous page's viewstate is no longer accessible. But that is not true.
Yes, we can access the viewstate variables across pages. This is only possible if Cross Page Posting or Server.transfer is used to redirect the user to other page. If Response.redirect is used, then ViewState cannot be accessed across pages.
I have created two *.aspx pages named:
1)    ViewStateContainer.aspx: This page sets the ViewState variable and transfers the user to another page using Server.transfer.
2) AccessViewState.aspx: This page accesses the ViewState variable of ViewStateContainer.aspx page.
This is the code of ViewStateContainer.aspx page:
public partial class ViewStateContainer : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ViewState["Page1"] = TextBox1.Text;
        Server.Transfer("AccessViewState.aspx");
    }

    public StateBag ReturnViewState()
    {
        return ViewState;
    }
}
As you can see, I have set a ViewState variable in Page Load and transfer the user to AccessViewState.aspx page using the Server.transfer() method.
This page also contains a method ReturnViewState() which actually returns the ViewState of this page to the calling function. The return type of the method is StateBag class.
StateBag class: This class is the primary storage mechanism for all HTML and Web server controls. It stores attribute/value pairs as strings associated with the control. It tracks changes to these attributes only after the OnInit method is executed for a page request, and saves the changes to the page's or control's viewstate.
Now let's take look at AccessViewState.aspx Page code:
public partial class AccessViewState : System.Web.UI.Page
{
    private StateBag PreviousPageViewState
    {
        get
        {
            StateBag returnValue = null;

            if (PreviousPage != null)
            {
                Object objPreviousPage = (Object)PreviousPage;

                MethodInfo objMethod = objPreviousPage.GetType().GetMethod
                                                                         ("ReturnViewState");

                return (StateBag)objMethod.Invoke(objPreviousPage, null);
            }

            return returnValue;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (PreviousPage != null)
        {
            if (PreviousPageViewState != null)
            {
                Response.Write(PreviousPageViewState["Page1"].ToString());
            }
        }
    }
}
Whenever we use Server.transfer or Cross Page Posting, We can get the previous page object via PreviousPage property. Using Previous Page, we can find the controls of the previous page. For example, one can access Label control placed in ViewStateContainer Page in current Page.
Looking at the code, I have created a PreviousPageViewState property in this page, which returns the previous page's ViewState. It first checks whether PreviousPage is null or not, if it's not null, then it creates an object of the previous page. Now using Reflection, we can invoke the method of the previous class. Using MethodInfo class, I have invoked the ReturnViewState() method of ViewStateContainer Page.
In Page_Load event, I am able to access the ViewState variable of ViewStateContainer Page. We can access all the viewstate variables set in ViewStateContainer Page.







No comments:

Post a Comment