1

我有一个多视图,里面有 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 中的值在回发中存在。虽然多视图保持状态,但我执行 response.redirect 以将查询字符串传递给 view2。由于我进行回发,因此我无法在 view2 中使用 txtbox1(在 view1 中)中的值。txtbox1 中的值在回发期间变为空。我尝试了以下代码

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 中的标签 1。当我做 response.redirect 时,textbox1 变为空,视图也变为空。

为什么视图状态没有价值?

谢谢!

4

1 回答 1

4

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

这是您的场景中发生的事情:

  1. 用户的浏览器第一次使用 HTTP 进入页面。这不是回发。
  2. 用户填写 TextBox1 并单击 Button1。这是回发(HTTP 帖子)。
  3. 在服务器上,将加密的隐藏 __VIEWSTATE 变量中的信息解包,并根据请求中的 post 数据与 TextBox1 和 Button1 的新值进行比较。
  4. Asp.Net 识别状态更改并在您的服务器代码中触发事件。这导致活动视图索引更改为 1。
  5. 浏览器现在接收显示 View2 的页面。
  6. 用户点击 Button2。这是回发(HTTP 帖子)。
  7. 服务器执行与将视图状态与发布数据进行比较并触发 Button2 单击事件之前相同的过程。
  8. 你的代码现在做了一些不同的事情。当您执行 Response.Redirect 时,服务器不会发回具有新视图状态的页面。您正在发送一个短标题,而隐藏表单变量中没有保留的视图状态信息。重定向强制浏览器立即对指定的 url 执行 HTTP get 操作。这不是 POSTBACK 并且视图状态已丢失。这与步骤 1 中从用户浏览器获取的第一个 HTTP 完全相同。

我希望这有帮助。我认为承认微软已经认识到他们在 Asp.net 中的视图状态模型的缺点是安全的。这使得实现性感的现代 ajax 应用程序变得非常困难,其中浏览器维护大部分应用程序状态并且只想从服务器发出对新数据的小请求。我认为这是放弃 Asp.Net MVC 中的视图状态模型的主要动机之一。

于 2012-11-26T21:03:30.247 回答