ASP.NETでは、セッションと複数のタブをどのように扱いますか?
-
22-07-2019 - |
質問
ASP.netで、ユーザーがデータベースにレコードを追加できるように設計されたアプリケーションを作成しました。ユーザーがレコードを追加すると、セッションで新しく追加されたレコードのID番号が設定され、ページResponse.Redirectsが「送信ありがとうございます」にリダイレクトされるようにページが設定されます。その後、元のページにリダイレクトして、さらに編集できるようにします。ユーザーは、この画面の[戻る]ボタンを使用して、元のレコード追加ページに戻り、データを編集することもできます。
ただし、ユーザーが異なるタブまたはウィンドウで2つのドキュメントを作成しようとする可能性があるため、セッションでIDを保存することはあまり良い解決策ではないことがわかりました。また、リテラルコントロールでIDを設定しようとしましたが、これにより、ユーザーが[戻る]ボタンを使用すると、リテラルコントロールがIDに設定されず、編集中のレコードではなく新しいレコードが追加されるという問題が発生します。
これには何らかの解決策がありますか?
解決
愚かな質問、なぜユーザーは戻るボタンを使用して投稿で受け入れられたばかりのデータを編集できるのですか?
以前に投稿されたデータの編集が一般的なシナリオである場合、編集を許可するデータが受け入れられたときにページにリダイレクトしないのはなぜですか。次に、戻るボタンを押すと、元の「クリーン」に戻ります。新しいデータページを挿入/追加します。
これにより、次のフローが得られます 追加-> [投稿]->編集-> ..... 追加-> [投稿]->編集-> [戻るボタン]->追加-> [投稿]->編集-> [投稿]->編集...
他のヒント
QueryStringにIDを保存することをお勧めします。レコードを追加したら、「ありがとう」にリダイレクトします。このページには、クエリ文字列のIDを使用して生成する編集フォームへのリンクが含まれていると思います。そのリンクをたどると、編集ページは、編集する正しいレコードをロードするためにクエリ文字列からIDを引き出します。
クエリ文字列にIDが指定されている場合、フォームの追加と編集は同じページでも可能です。フォームはそのレコードを編集することを知っています。そうでない場合、フォームは新しいレコードを追加します。
クエリ文字列にIDを追加しようとしましたか?次に、それを読み、必要に応じてセッションに追加できます(たとえば、ユーザーが[戻る]ボタンをクリックした場合)。
戻るボタンを使用するとレンダリングされたページ内のオブジェクトの編集を許可する多くの問題のようです。代わりに編集ボタンを与えるのは多すぎるでしょうか?
コントロールは、ViewStateに状態を保存します。 ViewStateの代わりにSessionStateを使用して情報を保存することを選択した場合、コントロールはその状態をセッション状態に保存し、複数のタブでは適切に機能しません。
まだSessionStateを使用しながら、この問題を回避する方法を見つけていません。私たちの解決策は、通常のViewStateを使用することでした。
IDをクエリ文字列に保存しようとしました(これはほとんど編集に適しています)が、問題は、[戻る]ボタンを使用するときのためにセッションに情報を保存するときです。ユーザーが次の操作を行った場合:
- ユーザーがレコード(1番目のレコード)を作成し、IDがクエリ文字列で渡され、セッションに一時的に保存されます。
- ユーザーが別のレコード(2番目のレコード)を作成すると、IDがクエリ文字列で渡され、セッションに一時的に保存されます。
- ユーザーは最初のレコードの[戻る]ボタンを使用して、クエリ文字列のないページに移動します。
これは恐らく大げさなシナリオですが、起こる可能性のあるシナリオです。私が持っている唯一の解決策は、JavaScriptでwindow.history.forward()を使用して、[戻る]ボタンの使用をブロックして追加ページに戻ることです。しかし、これは解決策としてはひどいものです。
私の質問は、なぜセッションに何かを保存するのかということです。セッションに何も保存しないようにできる場合は、完全に改善した方が良いと思います。
これについて考えてみると、上記の問題に対する適切な解決策のように聞こえますか?
- 最初にレコードを追加するとき、追加ページにアクセスしたときのタイムスタンプを非表示フィールドに保存します。
- このタイムスタンプは、ユーザーが[保存]をクリックしたときにセッションを介して渡されます。 IDとともに。
- ユーザーが同時に別のタブを開いて保存すると、新しいページのタイムスタンプがセッションを介して渡されます。
- ユーザーが(戻るボタンを使用して)最初のレコードの追加ページにアクセスしようとすると、システムはセッションを検索し、タイムスタンプがあるかどうか、およびそのページの非表示フィールドにあるものと一致するかどうかを確認します。
- 一致しない場合、ユーザーはプロンプトを受け取り、レコードを適切に編集するように指示されます。
これは妥当と思われますか、または過度に複雑に聞こえますか?