web-dev-qa-db-ja.com

ポストバックで変数を永続化する方法

単一のページ(.vbの背後にあるコードを含む)を作成し、Public intFileID As Integerを作成しました

ページロードでクエリ文字列を確認し、利用可能な場合は割り当てるか、intFileID = 0に設定します。

Public intFileID As Integer = 0

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        If Not Request.QueryString("fileid") Is Nothing Then
            intFileID = CInt(Request.QueryString("fileid"))
        End If

        If intFileID > 0 Then
            GetFile(intFileID)
        End If
    End If
End Sub

Private Sub GetFile()
    'uses intFileID to retrieve the specific record from database and set's the various textbox.text
End Sub

IntFileID変数の値に基づいてレコードを挿入または更新する[送信]ボタンのクリックイベントがあります。すべてが機能するためには、ポストバックでその値を維持できる必要があります。

このページは、SQLデータベースのレコードを挿入または更新するだけです。 gridview、formview、detailsview、またはそれ自体でキー値を永続化する他のradタイプのオブジェクトを使用していないため、それらを使用したくありません。

変更される可能性のあるHTMLに何かを作成せずに、intFileIDに設定された値を永続化するにはどうすればよいですか。

[編集] ViewStateを使用してintFileID値を永続化するようにPage_Loadを変更

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        If Not Request.QueryString("fileid") Is Nothing Then
            intFileID = CInt(Request.QueryString("fileid"))
        End If

        If intFileID > 0 Then
            GetFile(intFileID)
        End If

        ViewState("intFileID") = intFileID
    Else
        intFileID = ViewState("intFileID")
    End If
End Sub
23
Brian Boatright

他の人が指摘したように、それをセッションまたはビューステートに保存できます。ページ固有の場合は、SessionではなくViewStateに保存したいのですが、一般的に、1つの方法が他の方法よりも優先されるかどうかはわかりません。

VBでは、次のようにViewStateにアイテムを格納します。

ViewState(key) = value

そしてそれを次のように取得します:

value = ViewState(key)
43
jerhinesmith

保管場所:

  • セッション
  • ViewState
  • 非表示の入力
5
Kon

上記の内容を要約します。

Session、Viewstate、または非表示フィールドを使用できます。

Webファーム環境で機能するため、私は個人的にはビューステートを好みます。セッションは機能せず、ユーザーを待っているサーバーに保存しません。削除されるまで最大20分かかります。一般に、ビューステートはページの場所ですレベルデータ。

非表示フィールドを使用できますが、ユーザーはそれをより簡単に変更できます。

5
Mitchel Sellers

セッションに保存します。

Page.Session["MyPage_FileID"] = intFileID

ユーザーがナビゲートするときにそれを管理するロジックが必要ですが、ページがGETから読み込まれるときに常に設定されている場合(またはGETで使用できない場合はそれをクリアする場合)、後でそれを使用してもかまいません。送信ポストバックのセッション。

4
tvanfosson

覚えておいてください:

サーバーコードが実行されるたびに、ページクラスの新しいインスタンスに配置されます。それはすべてのポストバックです。

2
Joel Coehoorn

_Session["KeyName"] = your value;_

  1. 以下に示すように、型から型にキャストして、セッションからデータを取得して保存します。

Datatable dt = (DataTable)(Session["KeyName"]);

または

_ViewState["KEY"]= value;_

  1. 以下に示すように、型から型にキャストして、セッションからデータを取得して保存します。

String str = (String)ViewState["KEY"];

1
Sahil Saini

個人的には、ビューステートを簡単にオフにできるので、ビューステートではなくコントロールステートに値を保存することを選択します。何らかの理由でビューステートがオフに切り替えられても、ControlStateは保持されます。これを行う方法の例を含めました。

Private intFileId As Integer = 0

Public Property FileID() As Integer
    Get
        Return intFileId
    End Get
    Set(ByVal value As Integer)
        intFileId = value
    End Set
End Property


Protected Overrides Function SaveControlState() As Object
    Dim objState(2) As Object
    objState(0) = MyBase.SaveControlState()
    objState(1) = Me.FileID
    Return objState
End Function


Protected Overrides Sub LoadControlState(ByVal savedState As Object)
    Dim objState() As Object
    objState = savedState
    MyBase.LoadControlState(objState(0))
    Me.FileID = CInt(objState(1))
End Sub




Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    Me.Page.RegisterRequiresControlState(Me)
End Sub


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not Page.IsPostBack Then
        If Not String.IsNullOrEmpty(Request.QueryString("fileid")) Then
            Me.FileID = CInt(Request.QueryString("fileid"))
        End If
    End If

    Response.Write(Me.FileID.ToString())
End Sub
1
Chad

実際、ASP.NETページは、クエリ文字列を含めてそれ自体にポストバックするので、If Not Page.IsPostBack 状態。その後、ポストバックごとに設定されます。

1
Mark Brackett

セッションを次のように使用します tvanfossonによって推奨されます。 フォーラムのトピックページのコメント用のデータセットのような大きなデータを保持する場合、ViewStateとHiddenFieldは重すぎる可能性があります。

0
Sen Jacob