5

検索基準をセッション状態に保存し、asp.net updatepanel 内で検索を実行する検索アプリケーションを作成しています。複数の検索を連続して実行すると、2 番目または 3 番目の検索で最初の検索基準セットから結果が返されることがあります。

例: 最初の検索で "John Smith" を検索すると、John Smith の結果が表示されます。2 番目の検索で "Bob Jones" を検索すると、John Smith の結果が表示されます。

先ほど言ったように、すべての検索条件をセッション状態に保存し、それを ajax リクエスト内のセッション状態から読み取り、DB クエリをフォーマットします。VS にブレーク ポイントを配置すると、すべてが正常に動作しますが、ブレーク ポイントがないと、元の検索基準と結果が得られます。

私の推測では、それらはセッションに保存されているため、ajax リクエストは何らかの方法で独自のセッションを取得し、それに基準を保存し、毎回そのセッションから基準を取得しますが、非非同期のものは基準がいつ表示されるかを確認できます。変更され、それに応じて状態への変更が保存されますが、それらは 2 つの異なるセッションからのものであるため、保存および読み取られる内容に不一致があります。

編集:::さらに詳しく説明すると、検索条件をクエリ文字列に追加するという提案がありましたが、これは通常は良い方法であり、そうあるべきであることに同意しますが、私たちの要件に従っているとは思えません。彼らは、ユーザーが入力コントロールに入力して検索をヒットし、ページのリロードがなく、ページの進行状況インジケーターだけが表示され、現在のページで他の機能をナビゲートして使用できるようにすることを望んでいます。クエリ文字列に条件を追加すると、別のリクエストを実行してページ全体を読み込む必要があり、検索条件によっては非常に長い時間がかかる場合があります。これが、検索を実行するために ajax 呼び出しを使用している理由であり、別のフル ページ リクエストを発生させていない理由です..... これで状況が明確になることを願っています。

4

4 に答える 4

5

別の考えとして、私は常にupdatepanelで問題が発生し、PageMethodsを使用してライブラリから直接アトラスajaxリクエストを作成することを好みます。送受信するものをより細かく制御できます。UpdatePanelはページ全体を送信し、ページ制御階層全体を受信します。次に、「新鮮」なものを解析して表示します。

編集:条件をセッションに保存するために使用しているコードは何ですか?そして、セッションに保存された基準があるかどうかを実際にチェックし、代わりにそれを返すコードがメソッドにありますか?たぶんそれが、2番目と3番目のupdatepanelポストバックが、期待される結果ではなく、最初の基準セットを返す理由ですか?余談ですが、重いアトラスajaxを実行することで、2つのセッション(通常のポストバック用と非同期用)が絶対にないことを知っています。Webファームを使用している可能性はありますか?

編集#2:私も返信した人のファンでなければ、上で書いたもの(最初のパラグラフ)を書くことができなかったでしょう:https ://stackoverflow.com/users/60/デイブワード

于 2008-09-24T15:44:18.723 に答える
4

通常のASP.NETページの読み込み、ポストバック、およびASP.NETAJAXの部分的なポストバックの間に複数のセッションはありません。私はあなたにそれを確実に言うことができます。

検索文字列をセッションに保存するのではなく、検索テキストボックスのコンテンツを直接使用するのはどうでしょうか。とにかくページのライフサイクル全体で利用できるので、シャッフルする必要がある理由は考えられません。

最後に、要件について... UpdatePanelを使用しても、その機能によって部分的なポストバックが発生する場合、ユーザーがページ上の他の機能を使用できる必要があるという要件は満たされません。一度に1つの部分的なポストバックのみを進行できます。検索の進行中に別のイベントが発生した場合、検索リクエストは通知なしにキャンセルされます。

検索にページメソッドまたはWebサービスを使用すると、はるかに高速で、簡単で、より堅牢な方法になります。私は通常自分のサイトをプラグインしませんが、私の投稿のいくつかはあなたがしていることに正確に関連していると思います:

ユーザーコントロールを使用して、Webサービスを介して検索結果をレンダリングできます(UpdatePanelよりもはるかに高速です):http ://encosia.com/2008/02/05/boost-aspnet-performance-with-deferred-content-読み込み中/

または、検索結果をJSONとして返し、クライアント側でレンダリングすることもできます(さらに高速):http ://encosia.com/2008/06/26/use-jquery-and-aspnet-ajax-to-build- a-client-side-repeater /

これらの方法のいずれかを使用すると、検索機能を部分的なポストバックパラダイムから外すことができるため、実行速度が速くなり、使用する帯域幅とサーバーリソースが少なくなり、他のUpdatePanelアクティビティが同時に発生する可能性がなくなります。

于 2008-09-25T04:52:46.723 に答える
4

呼び出す関数の WebMethod 属性の EnableSession プロパティを設定する必要があります。

[WebMethod( EnableSession=true )]
public static void DoSomething(){
    /// ....
}
于 2008-09-24T15:32:41.887 に答える
0

ジェネリック ハンドラー .ashx を使用する場合は、IRequiresSessionState インターフェイスから派生させるだけです。

public class ActionRequest : IHttpHandler, IRequiresSessionState
{
}
于 2010-05-26T20:57:37.297 に答える