在多视图中使用viewstate在回发中传递值

时间:2012-05-01 01:16:28

标签: postback viewstate multiview

我有一个多视图,里面有2个视图。我要粘贴一个示例代码。

<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>

我希望txtbox1中的值在回发中存在。虽然multiviews维护状态我做response.redirect将querystring传递给view2。由于我做回发,我不能在view2中使用txtbox1(在view1中)中的值。在回发期间,txtbox1中的值变为null。我尝试了以下代码

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

当第一次加载页面时,我在view1中的txtbox1中键入内容并单击按钮,加载了view2,我有一个获取txtbox1值的代码,并在view1中将值写入inlabel1。当我执行response.redirect时,textbox1变为null,视图也变为null。

为什么viewstate中没有值?

谢谢!

1 个答案:

答案 0 :(得分:4)

Asp.Net viewstate与其他系统(如Rails,PHP甚至Asp.Net MVC)中的正常get / post浏览器请求非常不同。

以下是您的方案中发生的事情:

  1. 用户的浏览器第一次进行HTTP登录。这不是回发。
  2. 用户填写TextBox1并单击Button1。这是一个回发(HTTP帖子)。
  3. 在服务器上,解压缩加密的隐藏__VIEWSTATE变量中的信息,并根据请求中的发布数据与TextBox1和Button1的新值进行比较。
  4. Asp.Net识别状态更改并触发服务器代码中的事件。这会导致活动视图索引更改为1。
  5. 浏览器现在收到显示View2的页面。
  6. 用户点击Button2。这是一个回发(HTTP帖子)。
  7. 服务器完成与比较viewstate和发布数据之前相同的过程,并触发Button2点击事件。
  8. 您的代码现在做了不同的事情。执行Response.Redirect时,服务器不会使用新的viewstate发回页面。您正在发送一个短标题,而隐藏的表单变量中没有保留的视图状态信息。重定向强制浏览器立即对指定的URL执行HTTP get操作。这不是POSTBACK,视图状态已丢失。这与在步骤1中从用户的浏览器获得的第一个HTTP完全相同。
  9. 我希望这会有所帮助。我认为可以安全地承认微软已经认识到他们在Asp.net中的viewstate模型的缺点。这使得实现性感的,现代的ajax应用程序变得非常困难,其中浏览器维护大部分应用程序状态并且只想从服务器发出对数据的小请求。我认为这是放弃Asp.Net MVC中viewstate模型的主要动机之一。