0

ASP.NET MVC のいくつかのウィザード手順でデータベース テーブルを使用してデータの永続性を実装するための最良の方法は何ですか?

現時点では、セッションを使用して、いくつかのウィザード ステップ/ビューにわたって大量のデータを保持しています。問題が発生しており、セッション タイムアウトが原因であると思われます。このため、セッションをデータベース テーブルに置き換えることにしました。

これまでのところ、次のものが必要であることを確認しました。

  • ユーザーが最初のページにアクセスすると、ワークフロー全体でデータが保存される場所を決定する一意の ID/トークン (おそらくデータベースのプライマリ キー) が生成されます。この ID/トークンは、可能であれば URL を使用して永続化されるため、セッションを再実装する必要はありません。

  • ウィザードのビュー/ステップごとに表を分けてください。各アクションには、セッションに保存されたウィザード ステップ オブジェクトをテストするロジックが実装されており、ユーザーがワークフローのステップをスキップできないようになっています。データベース データの永続性を使用した同様のテストの実装は、単一のテーブルとは対照的に、データを複数のテーブルに分割した方が簡単です。

  • セッション タイムアウトを模倣するために、提供された ID/トークンに関連付けられたレコードのどこかに有効期限のタイム スタンプを保存する。

  • エンティティ フレームワークを使用してデータをプッシュおよびプルする

これをコードに実装する方法を理解するのに苦労しています。http://www.4guysfromrolla.com/webtech/041600-2.shtmlに出会いましたが、これは多少役に立ちましたが、ASP.NET MVC コントローラーに実装する方法を実際には説明していませんでした。

以下のコードのスニペットを提供して、セッションを使用して現在どのように処理を行っているかをある程度理解できるようにします。

コントローラ

[HttpGet]
public ActionResult StepOne() {
    StepOneViewModel stepOneModel;
    WizardViewModel wizard = (WizardViewModel)Session["Wizard"];

    if(wizard == null || wizard.StepOne == null)
        stepOneModel = new StepOneViewModel();

    else
        stepOneModel = wizard.StepOne 

    return View();
}

[HttpPost]
public ActionResult StepOne()
{
    //validate and store data into wizard session object
}

public ActionResult StepTwo()
{
    StepTwoViewModel stepTwoModel;
    WizardViewModel wizard = (WizardViewModel)Session["Wizard"];

    if(wizard == null || wizard.StepOne == null)
        return RedirectToAction("StepOne");

    if(wizard.StepTwo == null)
        stepTwoModel = new StepTwoViewModel();

    else
        stepTwoModel = wizard.StepTwo;

    Session["Wizard"] = wizard;

    return View();
}

ウィザード モデル

public WizardViewModel
{
   public StepOne { get; set; }
   public StepTwo  { get; set;}
}

このアプローチを実装する最良の方法は何ですか? データの取得元を決定するこの一意のトークンをどのように作成/追跡しますか? ユーザーが前のステップを完了し、スキップしようとしなかったことをどのようにテストしますか? このアプローチを実装する方法に関するコントローラーのコード/考えは大歓迎です。

4

1 に答える 1

0

過去に同様のパターンを実装した方法を次に示します。ここでは、ユーザーがシステムに登録されていないと想定しています (登録されている場合は少し簡単です)。

  1. ウィザードの最初のステップは、ユーザーの電子メール アドレスを収集することです。

  2. このセッションの一意のトークンを生成し、それを URL に埋め込み、ユーザーにメールで送信します。これは、ユーザーがいつでも戻ってきてワークフローを完了するために使用できます。トークンを十分に大きくして、人々がランダムなトークンを推測できないようにする必要があります。

注: 実際には、ワークフロー プロセスにマップするために内部で使用するトークン ID を生成します。また、URL に埋め込まれてユーザーに送信されるハッシュも生成します。

  1. ステップごとに別々のテーブルを使用するのではなく、通常のエンティティ テーブルを使用し、それらの上に、ユーザー トークンをエンティティ データにリンクし、状態を示すテーブルを用意します。それは。つまり、現在のステップを決定し、そのステップの正しいルートに移動する基本ルートがあることを意味します。

  2. トークンは定期的にクリーンアップされます。つまり、2 週間以上経過したトークンは削除されます。ユーザーにメールで送信された URL は引き続き機能しますが、新しいワークフローに移動し、トークンは新しいセッションで再利用されます。

  3. 最後に、ワークフローが完了したら、システムからトークンを削除できます。

ユーザーがシステムに登録されている場合は、電子メールを送信する必要はありません。ワークフローを何らかの方法でユーザーにリンクするだけで済みます。

于 2016-09-08T03:07:36.557 に答える