2011-01-28 10 views
0

私はajaxページを構築しようとしています。それは報告のページです。デフォルトでは、今日のレポートを読み込みます。ページにはカレンダーコントロールがあり、ユーザーが日付をクリックすると、対応するデータでグリッドビューをリロードします。セッションオブジェクトのデザインパターン

1) on the first page load, query the data for the page 
2) put the query result in the session object and display it in a gridview 
3) if the user requests new data, get new data from the query with different parameters 
4) put the result of the second query in the session object and display it 
5) if the user then requests the data from the first query, get it from the session object 
6) do the sorting and paging with the data held in the session. 

注:各クエリのデータには、約300-500行と約15個の列が含まれます。私はajaxコールでこれをすべてやりたい。避けたい提案や落とし穴には何がありますか?

ありがとうございました。

+0

セッションを使用して、ページ間で共有する一時的な情報を保存していますか?データを生成したページに表示されるものをセッションに読み込んでいるようです。もしそうなら、データを最初にセッションに入れるべきではありません。 –

+0

報告ページです。デフォルトでは、今日のレポートを読み込みます。ページにはカレンダーコントロールがあり、ユーザーが日付をクリックすると、対応するデータでグリッドビューをリロードします。 – frenchie

答えて

2

私はBackbone.jsを使用します。

  1. Serverは、JSON形式でレポートを生成します。
  2. クライアントには、JSONエンドポイントにバインドするこのレポートのBackbone.jsモデルがあります。
  3. クライアントは、レポートモデルをバックボーンビューとしてレンダリングします。
  4. クライアントは、適切な場合にのみサーバーからレポートを再読み込みします。

以前に表示した日数のレポートは、バックボーンモデルインスタンスとしてクライアントに残っているため、ユーザーが強制しない限り、サーバーからリロードする必要はありません。私はこれがあなたの主な関心事だと思いますか?

あなたはまだクライアント側フレームワークなしの領域にいるかもしれませんが、これらのページをもっとやりたい、あるいはもっと複雑になることを計画しているなら、かなり早くスパゲッティに行くことができますBackbone.jsのようなものはありません。

PS。私はこれが.NETに関連していることに気付きました。私は.NETについて何も知らないので、何か似たようなことをする組み込みのクライアントサイドフレームワークがあるかもしれません。(コメントを読んだ後に更新)

EDIT:サーバー側のキャッシュのために

、私は、DBまたは個別の専用キャッシュストア(例えばmemcacheの)のいずれかで非正規化レポートテーブルがより良い練習だと思いますセッションオブジェクト。

ただし、ユーザーごとに1つの可能なレポートが1つあり、memcacheが設定されていないが、何らかの理由でDBを使用したくない場合は、そのセッションに格納することが理にかなっていますオブジェクト。ただし、毎日のレポートがすべてのユーザーで同じであれば、1回ではなくN回キャッシュします。外部フックから無効にすることも難しく、ログアウト時にユーザーがキャッシュを失う可能性があります。

だから、私はたぶん典型的なget-or-setパターンを使って、最初にキャッシュからレポートを読み込み、DBにフォールバックしようとします。その後、キャッシュされたレポートを無効化/更新するのは、ユーザーが強制した場合、またはレポートの作成に使用したデータが変更された場合のみです。 AJAXコールは、日付別にレポートを要求しますが、レポートは特定されます。

+0

これはかなりクールに見えます!ありがとう。私は別の目的のためにそれを調べるつもりです。しかし、現在のページでは、サーバー側のキャッシュを調べています。 – frenchie

+0

cool!問題ない。私は、サーバーサイドキャッシングに関するいくつかの考えで答えを広げました – clocksucker

1

あなたはウィンドウについて忘れています。クライアントはウィンドウではなく、クライアントはブラウザであり、多くのウィンドウ/タブを含むことができます。正しいウィンドウをレンダリングしていることを確認する必要があります。通常、私は隠し値を送信することによってこれを処理します。

問題は、セッションの再開/新しいウィンドウの開始です。

+0

クライアントユーザーエージェントはこの質問に何をしなければなりませんか?クライアントユーザーエージェントは、セッションを使用してデータベース結果を格納して同じページに表示することを推奨しません。 –

+0

@Frazell Thomasユーザーエージェント?何?私は何を書きましたか、どこで、何ですか?ときにどのように? – stefan

+0

@Stefanブラウザはユーザエージェント(ブラウザの正式名称)です。彼の質問の文脈でクライアントブラウザが何をしているのか(複数のタブなど)は関係ないと言っていました。 –

2

Javascript Ajax Sceneriosでデータを使用したい場合は、HTTP Handlerを作成して、要求に応じて必要なデータ結果セットを返すことが最も理にかなっています。

セッションオブジェクトの使用は、非同期にはアクセスできないため、解決策ではありません。その結果、あなたのページは、このデータをクエリーしてJavascriptオブジェクトにフィードバックすることはできません(HTTPハンドラを作成して返信する場合を除き、HTTPハンドラで直接データを照会するだけの場合は無意味です) )。

+1

私は混乱しています! – frenchie

+0

どの部分が混乱しているので、私は答えを明確にすることができます。 –

0

私は、セッション内で複数のクエリのコピーを保持することはありません。あなたがセッションでそれを保持したいと思う主な理由は、ソート/ページングの速度を向上させることにあると思われます。ユーザーはそれらが比較的高速であることを期待していますが、新しい日付の選択は遅くなることがあります。さらに、最初のクエリを実際にリロードする可能性はありますか?

その他の回答は、一般的にセッションに格納することで良い落とし穴になります。

関連する問題