1

私はまだ .NET と ASP.NET MVC に比較的慣れていないので、DB から取得した情報を一時的に保存して、クライアントからの後続のサーバー要求で使用できるようにすると便利な場合がいくつかありました。.NET セッションを使用してこの情報を保存し、タイムスタンプをキーオフし、サーバーに再度アクセスしたときにタイムスタンプを使用して情報を取得し始めました。

したがって、基本的な使用例は次のとおりです。

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

これは、セッションを一時ストレージとして使用する場合に常に使用し始めたスキームです。しかし、JS でタイムスタンプを生成することは必ずしも安全ではなく、全体が少し構造化されていないように感じます。これに使用できる既存の設計パターン、またはより合理化された安全なアプローチはありますか? どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

1

Ok, I'm not sure I understand you correctly as the JS timestamp step seems superfluous. But this is what I would do.

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]]);
}
于 2011-07-21T03:39:10.867 に答える
1

セッションにデータを保存する場所を確認TempDataできます。何かを引き出すとTempData、アクションの実行が完了した後に削除されます。

TempDataそのため、アクションに何かを入れると、TempData から再度TempData要求されるまで、他のすべてのアクションに存在します。TempData

またはTempData.Peek("key")呼び出すまでメモリに保持する呼び出しもできますTempData["key"]TempData.Remove("key")

于 2011-07-20T23:21:38.110 に答える