2011-07-20 11 views
1

私はまだ.NETとASP.NET MVCには比較的新しいですが、DBから取得した情報を一時的に保存して、クライアントからの後続のサーバー要求で使用できるようにするのが良いでしょう。 。 .NETセッションを使用してこの情報を保存し、タイムスタンプからキー入力してから、サーバーに再度アクセスしたときにタイムスタンプを使用して情報を取得し始めました。一時セッションに.NETセッションを使用する場合のベストプラクティス?

だから、基本的なユースケース:

  1. ユーザーがクリックする「クエリ」ボタンは、システムからの情報を収集します。 JSで
  2. にセッションへのキーのクライアントからのユニークなタイムスタンプを使用して、現在の時刻のタイムスタンプを生成し、サーバで要求
  3. でサーバーにこれを渡し、サーバー上でDB
  4. から情報を収集応答オブジェクトを格納します。クライアントへ
  5. 戻り応答オブジェクト
  6. ユーザーがボタンをもう一度#2からのダウンサーバへ
  7. 峠同じタイムスタンプ(Excelのドキュメントにクエリ結果をフォーマットします)、そして#4からのクエリ結果を収集するために使用する「レポートの生成]をクリックします。
  8. 追加のDBヒットなしでレポートを生成します。

これは、私がセッションを一時記憶域として使用する場合に使用するようになった計画です。しかし、JSでタイムスタンプを生成することは必ずしも安全ではなく、全体的なことが少しは気になる。これに使用できる既存の設計パターン、またはより合理化された/安全なアプローチがありますか?どんな助けもありがとう。

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

+0

JSタイムスタンプの目的は何ですか? –

+0

JSタイムスタンプは、Session変数のキーとして使用できる一意の値を意味します。私たちは簡単に乱数を生成することができましたが、それでも繰り返し可能です。 –

答えて

1

TempDataをご覧になってください。TempDataのデータは、Sessionに保存されています。TempDataから何かを引っ張ると、アクションの実行後に削除されます。

TempDataに何かを入れた場合、それは再びTempDataがTempDataからリクエストされるまで、他のすべてのアクションの間にTempDataになります。あなたがTempData["key"]またはTempData.Remove("key")

+0

私の理解では、TempDataは現在の要求と次の要求に対してのみ有効です。 TempDataにクエリのレスポンスを保存すると(「Generate Report」をクリックしたときに取得されると思われる)、ユーザーは次のアクションがレポートを生成する代わりにCtrlキーを押しながらリンクをクリックすると判断した彼らが報告書を作成することを決定したときの運勢。 ViewDataはCtrl +クリック操作でのみ有効で、応答オブジェクトは含まれていませんでした。 TempDataはリダイレクトとリダイレクトにのみ有効だと言う記事がたくさんあります。 –

1

[OK]を呼び出すまで

また、私はJSのタイムスタンプのステップは不要と思われるように私が正しくあなたを理解していない、メモリに保管されますTempData.Peek("key")を呼び出すことができます。 しかしこれは私がやることです。

public static string SessionReportKey = "Reports"; 
public static string ReportIDString = "ReportID"; 
public Dictionary<string, object> SessionReportData 
{ 
    get 
    { 
     return Session[SessionReportKey] == null ? 
      new Dictionary<string, object>() : 
      (Dictionary<string, object>) Session[SessionReportKey]; 
    } 
    set 
    { 
     Session[SessionReportKey] = value; 
    } 
} 
public ActionResult PreviewReport() 
{ 
    //retrive your data 
    object reportData = GetData(); 

    //get identifier 
    string myGUID = new GUID().ToString(); 

    //might only need [SessionReportData.Add(myGUID, reportData);] here 
    SessionReportData = SessionReportData.Add(myGUID, reportData); 

    //in your view make a hyperlink to PrintReport action with a 
    //query string of [?ReportID=<guidvalue>] 
    ViewBag[ReportIDString] = myGUID; 

    return View(reportData); 
} 


public FileContentResult PrintReport() 
{ 
    if(SessionReportData[QueryString[ReportIDString]] == null) 
    { 
     //error no report in session 
     return null; 
    } 
    return GenerateFileFromData(SessionReportData[QueryString[ReportIDString]]); 
} 
関連する問題