単一のページ(.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
他の人が指摘したように、それをセッションまたはビューステートに保存できます。ページ固有の場合は、SessionではなくViewStateに保存したいのですが、一般的に、1つの方法が他の方法よりも優先されるかどうかはわかりません。
VBでは、次のようにViewStateにアイテムを格納します。
ViewState(key) = value
そしてそれを次のように取得します:
value = ViewState(key)
保管場所:
上記の内容を要約します。
Session、Viewstate、または非表示フィールドを使用できます。
Webファーム環境で機能するため、私は個人的にはビューステートを好みます。セッションは機能せず、ユーザーを待っているサーバーに保存しません。削除されるまで最大20分かかります。一般に、ビューステートはページの場所ですレベルデータ。
非表示フィールドを使用できますが、ユーザーはそれをより簡単に変更できます。
セッションに保存します。
Page.Session["MyPage_FileID"] = intFileID
ユーザーがナビゲートするときにそれを管理するロジックが必要ですが、ページがGETから読み込まれるときに常に設定されている場合(またはGETで使用できない場合はそれをクリアする場合)、後でそれを使用してもかまいません。送信ポストバックのセッション。
覚えておいてください:
サーバーコードが実行されるたびに、ページクラスの新しいインスタンスに配置されます。それはすべてのポストバックです。
_
Session["KeyName"] = your value;
_
- 以下に示すように、型から型にキャストして、セッションからデータを取得して保存します。
Datatable dt = (DataTable)(Session["KeyName"]);
または
_
ViewState["KEY"]= value;
_
- 以下に示すように、型から型にキャストして、セッションからデータを取得して保存します。
String str = (String)ViewState["KEY"];
個人的には、ビューステートを簡単にオフにできるので、ビューステートではなくコントロールステートに値を保存することを選択します。何らかの理由でビューステートがオフに切り替えられても、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
実際、ASP.NETページは、クエリ文字列を含めてそれ自体にポストバックするので、If Not Page.IsPostBack
状態。その後、ポストバックごとに設定されます。
セッションを次のように使用します tvanfossonによって推奨されます。 フォーラムのトピックページのコメント用のデータセットのような大きなデータを保持する場合、ViewStateとHiddenFieldは重すぎる可能性があります。