データベースからレコードを取得し、それを Web ページ (私は ASP.NET を使用しています) に表示する必要がありますが、そのレコードの ID (主キー) をどこかに保存して、後でその ID を使用してデータベースに戻ることができるようにします (おそらく更新を行うため)。
ID を ViewState や非表示フィールドに保存するなど、おそらくいくつかの方法があることはわかっていますが、どの方法が最適で、他の方法よりもこの方法を選択する理由は何ですか?
場合によります。
誰かがレコードIDを見てもかまいませんか?その場合、非表示フィールドとビューステートの両方が適切ではありません。セッション状態で保存するか、ビューステートを暗号化する必要があります。
誰かが偽のIDでフォームを送信してもかまいませんか?その場合、隠しフィールドを使用することはできません(そして、ボーナスとしてCSRF保護を検討する必要があります)
あなたはそれを不変にしたいのですが、それが(いくつかの仕事で)閲覧できるようになっていることを気にしませんか?ビューステートを使用し、ページで(またはグローバルに)enableViewStateMac="true"を設定します
非表示にして保護したいのですが、セッション状態を使用できませんか?次のweb.configエントリを設定して、ビューステートを暗号化します
<pages enableViewState="true" enableViewStateMac="true" />
<machineKey ... validation="3DES" />
エンド ユーザーに ID を知らせますか? たとえば、id 値がデータベースの標準の 1,1 シードである場合、その数値を見て顧客の数を確認できます。値を暗号化すると (viewstate のように)、キーを解読するのがはるかに難しくなります (ただし、不可能ではありません)。
別の方法は、それをセッションに保存することです。これにより、アプリケーションのパフォーマンスが(単なる整数の場合は非常に小さい)影響を受けますが、ユーザーとしてはその主キーが表示されないことを意味します。また、オブジェクトをアプリケーションの他の部分に公開します。公開したい場合としない場合があります (セッション オブジェクトは、クリアされるまで、設定された時間 (5 分など) が経過するまで、またはブラウザー ウィンドウが閉じられるまでのいずれか早い方) に残ります。 .
ビューステートはページのオブジェクトを保存するだけでなく、[戻る] ボタンを使用するとオブジェクトを記憶するため、ポストバックのたびにビューステートの値によってクライアントに余分な負荷がかかります。つまり、ポストバックするたびにビューステートが少し大きくなり、使いにくくなります。ブラウザが別のページに移動するまで、それらはページにのみ存在します。
このようにページにIDを保存するときはいつでも、常にプロパティを作成します
public int CustomerID {
get { return ViewState("CustomerID"); }
set { ViewState("CustomerID") = value; }
}
また
Public Property CustomerID() As Integer
Get
Return ViewState("CustomerID")
End Get
Set(ByVal value As Integer)
ViewState("CustomerID") = value
End Set
End Property
そうすれば、Viewstate からセッション変数または非表示のフォーム フィールドに変更する場合は、プロパティ参照で変更するだけで、ページの残りの部分は「Page.CustomerID」を使用して変数にアクセスできます。
ViewState はオプションです。閲覧中のページのみ有効です。Session オブジェクトのような他のリソースへのリクエストは引き継がれません。
隠しフィールドも機能しますが、ページのソースを表示するのに十分なほど賢い人に、アプリケーションに関する情報が漏れています。
レコード全体を ViewState に保存して、サーバーへの別のラウンド トリップを回避することもできます。
私は個人的に、セッションに何かを入れることに非常に慎重です。ワーカー プロセスが何度も循環し、セッション状態が失われました。
あなたがあなたの問題を説明したように、私はそれを隠しフィールドまたはページのビューステートに入れます。
また、このようなデータをどこに置くかを決定するときは、常にデータのスコープを見てください。範囲は単一のページですか、それともセッション全体ですか? 答えが「セッション」の場合、それを Cookie に入れます。(免責事項: Cookie が有効になっていることがわかっているイントラネット アプリを作成します。)
単純な ID がクエリ文字列で渡すことを選択する場合、その方法ではポストバックを行う必要がなく、ページはユーザーと検索エンジンにとってよりアクセスしやすくなります。
私はそのようなことを隠されたフィールドに貼り付ける傾向があります
<asp:label runat=server id=lblThingID visible=false />
Session["MyId"]=myval;
それは少し安全であり、基本的にビューステートに置くのと同じメカニズムを提供します