4

ASP.NET ViewState 機能は、両刃の剣になる場合があります。私はほとんどのプロジェクトでこれを使用しており、開発が大幅にスピードアップします。

私の問題は、ユーザーがページを更新しようとするとビューステートが失われる場合があることです。また、ユーザーがページをブックマークしたい場合がありますが、元に戻すとビューステートが失われます。

最新のブラウザーは、まったく望ましくない POST 操作 (たとえば asp ポストバック) の結果であるページをユーザーが更新しようとすると、ばかげたダイアログを表示します。

ViewState とポストバック モデルを引き続き使用する方法はありますが、更新ダイアログ ボックスの欠点はありません。(そして、可能であればページをブックマークしてください。)

私がやりたいことの例は、レコードとチェックボックスが横にあるページを作成することです。ユーザーは、削除するすべてのレコードをチェックしてから削除ボタンをクリックするオプションがあります。ユーザーが [削除] をクリックすると、サーバー上でレコードが分析され、削除の確認ボタンで選択されたすべてのレコードが新しいページに一覧表示されます。ユーザーが更新をクリックすると、このばかげたボックスが表示され、投稿するかどうかを確認できます。

ViewState が Post Back モデルを使用した結果であることは理解しています。つまり、ほとんどの asp.net ページが POST 操作の結果であることを意味しますが、それを回避する方法はあるのでしょうか。

私がうまくいくと思った回避策:
Page_Unload イベントで、一意の ID を使用してセッションにビューステートを保存し、URL に一意の ID を使用してページが読み込まれた後、クエリ文字列パラメーターとして一意の ID を使用してユーザーを同じページにリダイレクトします。ビューステートはセッションからロードされ、現在のページに挿入されます。このようなメソッドを使用すると、ユーザーはページを更新して、常に同じ結果を得ることができます。

PS私はResponse.Redirect()、および/またはクエリ文字列を使用できることを理解していますが、単純さを使用したいですViewState

4

4 に答える 4

2

私の 2 セント: ViewStateサンドバッグのシンプルさを使用する代わりに、 Sessionのシンプルさを使用してください。これは実際には同じシンプルさであり、ページの更新などについて気にする必要はありません。さらに、パフォーマンスに影響を与えることなく、組み込み型以外のものを格納するために使用できるため、セッションはより柔軟です (ViewState でも同様に実行できますが、パフォーマンスに影響します)。

于 2008-12-10T14:55:06.153 に答える
1

@Asaf - 私はあなたの答えに反対票を投じませんでしたが、いくつかの理由があります:

1) クエリ文字列に複雑な型を格納できない 2) IE ではクエリ文字列が約 2Kb に制限されているが、これはそれほど多くない 3) GET メソッドの誤用 - GET は文字通りデータを「取得」するためのもの ( google の検索バー) と POST は、サーバー上のデータ (連絡先フォームなど) を操作するためにサーバーにデータを「投稿」するためのものです。4) Page.IsPostBack に依存するものはすべて機能しなくなります。

于 2011-01-01T01:01:57.597 に答える
1

ここで一つ一つ感想を述べていきます。

ダイアログが繰り返し投稿について警告するという事実は、私にとっては良いことです. それがチェックアウトページで、再送信すると、どういうわけかユーザーのクレジットカードに再度請求されることになるとしたらどうでしょう。ダイアログの言葉遣いはもっと良いかもしれませんが、私たちは今いる場所にいることに同意します.

ブックマークの動作について考えると、そのページに何度もアクセスしたくなることを意味しますが、それが起こる前にセッションが終了する可能性があります。したがって、ビューステートを GUID に保存できますが、そのビューステートをデータベースに潜在的に永久に保持する必要があります。途中でページが変わったら?そのビューステートは無効になります。

確かにあなたの場合、データベースからユーザーのデータをロードし、通常どおり page_load 中にページにデータを入力するクエリ文字列パラメーターが必要ですか? www.my-site.com/Customer.aspx?Id=90401 など。

私の提案は、ツールと戦わないことです。お役に立てれば。

于 2008-12-09T10:02:17.070 に答える
-1

これは洗練された解決策ではないかもしれませんが、フォーム メソッドを GET に変更すると、ブックマークの問題と更新の問題の両方が解決すると思います。

クエリ文字列を使用する場合と同じですが、VIEWSTATE の抽象化はそのままです。

于 2009-01-21T13:18:02.970 に答える