2012-05-01 21 views
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。由於我做回發,我不能使用txtbox1(在view1),在view2中的值。回發期間,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 

頁面加載後的第一次,我鍵入txtbox1在廠景的東西,點擊按鈕,視圖2加載和我有得到txtbox1和值碼將值inlabel1寫入view1中。當我做response.redirect時,textbox1變爲null,並且view也變爲null。

爲什麼viewstate中沒有價值?

謝謝!

回答

4

Asp.Net viewstate與其他系統(如Rails,PHP甚至Asp.Net MVC)中的普通get/post瀏覽器請求有很大不同。

這裏是在您的業務情景上:

  1. 用戶的瀏覽器HTTP GET頁上的第一次。這不是回傳。
  2. 用戶填入TextBox1並單擊Button1。這是一個回傳(HTTP post)。
  3. 在服務器上,加密隱藏__VIEWSTATE變量中的信息將被解包,並根據請求中的發佈數據與TextBox1和Button1的新值進行比較。
  4. Asp.Net標識狀態更改並觸發服務器代碼中的事件。這會導致活動視圖索引更改爲1.
  5. 瀏覽器現在接收到顯示View2的頁面。
  6. 用戶點擊Button2。這是一個回傳(HTTP post)。
  7. 服務器經歷與比較視圖狀態到發佈數據並觸發Button2單擊事件之前相同的過程。
  8. 你的代碼現在做了一些不同的事情。當您執行Response.Redirect時,服務器不會以新的視圖狀態發回頁面。您正在發送一個短的標題,而隱藏的表單變量中沒有保存的視圖狀態信息。重定向強制瀏覽器立即對指定的URL執行HTTP獲取操作。這不是一個POSTBACK並且視圖狀態已經丟失。這與第一步從用戶瀏覽器獲得的第一個HTTP完全相同。

我希望這有助於。我認爲可以肯定的是,微軟已經認識到他們在Asp.net中的視圖狀態模型的缺點。如果瀏覽器保持大部分的應用程序狀態,並且只想從服務器發出新的數據請求,那麼實現性價比更高的現代ajax應用程序將非常困難。我認爲這是在Asp.Net MVC中放棄視圖狀態模型的主要動機之一。

+0

實際上,我認爲viewstate被「拋棄」了,因爲MVC沒有服務器端控件,這是首先使用viewstate的地方。 –

+0

100%同意。雞和雞蛋。 – randomfactor

+0

Buck-AWK!很好地分析發生了什麼,否則,順便說一句。 +1 –