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 の値が 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 の値を取得して値 inlabel1 を view1 に書き込むコードがあります。そして、response.redirect を実行すると、textbox1 が null になり、ビューも null になります。

ビューステートに価値がないのはなぜですか?

ありがとう!

4

1 に答える 1

4

Asp.Net ビューステートは、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. サーバーは、ビューステートを投稿データと比較する前と同じプロセスを経て、Button2 クリック イベントを発生させます。
  8. あなたのコードは今、何か違うことをします。Response.Redirect を実行すると、サーバーは新しいビューステートでページを送り返しません。非表示のフォーム変数に保存されたビューステート情報を含まない短いヘッダーを送信しています。リダイレクトにより、ブラウザーは指定された URL に対して HTTP 取得操作をすぐに実行するように強制されます。これはポストバックではなく、ビュー ステートが失われています。これは、ステップ 1 でユーザーのブラウザーから取得した最初の HTTP とまったく同じシナリオです。

これが役立つことを願っています。Microsoft が Asp.net のビューステート モデルの欠点を認識していることは認めても差し支えないと思います。ブラウザーがアプリケーションの状態の大部分を維持し、サーバーからの新しいデータに対して小さな要求を行いたいだけの場合、魅力的で最新の ajax アプリケーションを実装することは非常に困難になります。これが、Asp.Net MVC でビューステート モデルを放棄する主な動機の 1 つだと思います。

于 2012-11-26T21:03:30.247 に答える