データベース ID フィールドを ViewState に保存する必要がありますか?
質問
データベースからレコードを取得し、それを Web ページ (ASP.NET を使用しています) に表示する必要がありますが、そのレコードの ID (主キー) をどこかに保存して、後でその ID を使用してデータベースに戻ることができるようにします (おそらくアップデートを行うためです)。
これを行うには、ID を ViewState や非表示フィールドに保存するなど、おそらくいくつかの方法があることはわかっていますが、最良の方法は何ですか?また、他の方法ではなくこの方法を選択する理由は何ですか?
解決
場合によります。
誰かがレコード ID を見ても構いませんか?そうした場合、非表示フィールドとビューステートの両方が適切ではなくなります。セッション状態に保存するか、ビューステートを暗号化する必要があります。
誰かが偽の ID でフォームを送信しても気にしますか?使用すると、非表示フィールドを使用できなくなります (おまけとして CSRF 保護を考慮する必要があります)。
変更できないようにしたいが、(何らかの作業をすれば) 閲覧できるようにすることは気にしませんか?viewstate を使用し、ページ (またはグローバル) でenableViewStateMac="true" を設定します。
非表示にして保護したいが、セッション状態を使用できないのですか?次の web.config エントリを設定してビューステートを暗号化します。
<pages enableViewState="true" enableViewStateMac="true" />
<machineKey ... validation="3DES" />
他のヒント
エンドユーザーにIDを知らせたいですか?たとえば、ID 値がデータベースの標準 1,1 シードである場合、その数値を見て顧客の数を確認できます。(ビューステートのように) 値を暗号化すると、キーを解読するのがはるかに難しくなります (ただし、不可能ではありません)。
別の方法は、それをセッションに保存することです。これにより、アプリケーションに(単なる整数の場合は非常に小さい)パフォーマンスの影響が生じますが、ユーザーとしてその主キーがまったく表示されないことを意味します。また、オブジェクトをアプリケーションの他の部分に公開しますが、公開したくない場合もあれば、公開したくない場合もあります (セッション オブジェクトは、クリアされるか、設定された時間 (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 がクエリ文字列で渡すことを選択した場合、ポストバックを行う必要がなくなり、ユーザーや検索エンジンにとってページにアクセスしやすくなります。
Session["MyId"]=myval;
これはもう少し安全で、基本的にビューステートに置くのと同じ仕組みを提供します。
隠しフィールドにそのようなものを貼り付ける傾向があるので、少しだけやってください
<asp:label runat=server id=lblThingID visible=false />