Question

I have a multiview and have 2 views inside it. I am going to paste a sample code.

<asp:MultiView ID="MultiView1" ActiveViewIndex="0" runat="server">
<asp:View ID="View1" runat="server">
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <asp:Button ID="Button1" runat="server" Text="view1" />
    <asp:Label ID="Label2" runat="server" ></asp:Label>
</asp:View>
<asp:View ID="View2" runat="server">
    <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
    <asp:Button ID="Button2" runat="server" Text="view2" />
</asp:View>
</asp:MultiView>

I want the value in txtbox1 to be there in postback. Though multiviews maintain state i do response.redirect to pass querystring to view2. Since i do postback i cannot use the value in txtbox1(in view1), in view2. The value in txtbox1 becomes null during postback. I tried the following code

Public Partial Class viewstatetest
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles    Me.Load
If (Not Page.IsPostBack()) Then
    MultiView1.ActiveViewIndex = 0
Else
    TypedPassword = TextBox1.Text
    TextBox1.Attributes.Add("value", TypedPassword)
End If
End Sub

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles   Button1.Click
MultiView1.ActiveViewIndex = 1
End Sub

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles    Button2.Click
MultiView1.ActiveViewIndex = 0
Label1.Text = TextBox1.Text
Response.Redirect("viewstatetest.aspx")
End Sub

Public Property TypedPassword() As String
Get
    If (ViewState("TypedPassword") IsNot Nothing) Then
        Return CStr(ViewState("TypedPassword"))
    End If
    Return ""
End Get
Set(ByVal value As String)
     ViewState("TypedPassword") = value
End Set
End Property
End Class

When the page loads for the first time, i type something in txtbox1 in view1 and click on the button, view2 is loaded and i have a code that gets the value of the txtbox1 and writes the value inlabel1 in view1. And when i do response.redirect the textbox1 becomes null and view also become null.

Why there is no value in viewstate?

Thanks!

Was it helpful?

Solution

Asp.Net viewstate is very different from normal get/post browser requests in other systems such as Rails, PHP, or even Asp.Net MVC.

Here is what is going on in your scenario:

  1. User's browser does HTTP get on page for first time. This is not a postback.
  2. User fills in TextBox1 and clicks Button1. This is a postback (HTTP post).
  3. On the server, the information in the encrypted hidden __VIEWSTATE variable is unpacked and compared with the new values for TextBox1 and Button1 according to the post data in the request.
  4. Asp.Net identifies state changes and fires events in your server code. This results in the change of the active view index to 1.
  5. The browser now receives the page with View2 shown.
  6. User hits Button2. This is a postback (HTTP post).
  7. The server goes through the same process as before comparing viewstate to post data and fires the Button2 click event.
  8. Your code now does something different. When you do a Response.Redirect, the server does not send back the page with new viewstate. You are sending a short header without the preserved viewstate information in the hidden form variable. The redirect forces the browser to immediately do an HTTP get operation to the url specified. THIS IS NOT A POSTBACK and the view state has been lost. It is exactly the same scenario as the first HTTP get from the user's browser in step 1.

I hope this helps. I think it is safe to admit that Microsoft has recognized the drawbacks from their viewstate model in Asp.net. It makes it quite difficult to implement sexy, modern ajax applications where the browser is maintaining most of the application state and just wants to make small requests for new data from the server. I think this is one of the primary motivations for abandoning the viewstate model in Asp.Net MVC.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top