2012-05-01 7 views
1

私は多視点を持ち、内部に2つのビューを持っています。私はサンプルコードを貼り付けます。マルチビューのポストバックを介してviewstateを使用して値を渡す

<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を実行してquerystringをview2に渡します。私はポストバックを行うので、view2のtxtbox1(view1内)の値を使用することはできません。ポストバック中にtxtbox1の値がnullになります。私が最初にページが読み込まが、私はVIEW1でtxtbox1で何かを入力し、ボタンをクリックすると、VIEW2がロードされていると私は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にラベル1の値を書き込みます。そして、私がresponse.redirectをするとき、textbox1はnullになり、ビューもnullになります。

viewstateに値がないのはなぜですか?

ありがとうございます!

答えて

4

Asp.Net viewstateは、Rails、PHP、Asp.Net MVCなどの他のシステムでの通常のget/postブラウザー要求とは大きく異なります。

はここにあなたのシナリオで何が起こっているのかである。

  1. ユーザーのブラウザが最初にページにHTTP GETを行います。これはポストバックではありません。
  2. ユーザーがTextBox1を塗りつぶし、Button1をクリックします。これはポストバック(HTTPポスト)です。
  3. サーバーでは、暗号化された隠し__VIEWSTATE変数の情報が解凍され、要求内のポストデータに従ってTextBox1とButton1の新しい値と比較されます。
  4. Asp.Netは、サーバーコード内の状態の変化とイベントの発生を識別します。これにより、アクティブなビューインデックスが1に変更されます。
  5. ブラウザは、表示されたView2のページを受信します。
  6. ユーザーヒット数Button2。これはポストバック(HTTPポスト)です。
  7. サーバーは、ビューステートとデータをポストする前と同じプロセスを経て、Button2クリックイベントを発生させます。
  8. あなたのコードは今何か異なっています。 Response.Redirectを実行すると、サーバーは新しいviewstateでページを返送しません。隠れたフォーム変数に保存されたビューステート情報を含まない短いヘッダーを送信しています。リダイレクトでは、ブラウザは指定されたURLにHTTP get操作を強制的に実行します。これはPOSTBACKではなく、ビューステートは失われています。これは、手順1でユーザーのブラウザから取得した最初のHTTPとまったく同じシナリオです。

これが役立ちます。私は、MicrosoftがAsp.netのviewstateモデルの欠点を認識したことを認めても安全だと思います。ブラウザがアプリケーションの状態の大部分を維持し、サーバーから新しいデータをほんの少しだけ要求したい、セクシーで現代的なajaxアプリケーションを実装するのは非常に難しいです。私はこれがAsp.Net MVCのviewstateモデルを放棄するための主な動機の一つだと思います。

+0

実際、ビューステートを使用するのはMVCにはサーバーサイドのコントロールがないため、ビューステートが '放棄されました'と言います。 –

+0

100%が同意します。鶏と卵。 – randomfactor

+0

Buck-AWK!そうでなければ起こっていることの良い分析、btw。 +1 –

関連する問題