2011-12-06 10 views
1

私は、Entity FrameworkでMVC 3アプリケーションのユーザー登録システムを実装する必要があるプロジェクトのポイントにいます。複数のページとエンティティでユーザー登録を処理する方法

のI /登録の一環として充填する必要がある次のエンティティがあります。

  • ユーザー
  • 役割
  • ビジネス

古いアプリケーション(私たちはそれをv1と呼ぶでしょう)すべてのデータを含むクラスで登録プロセスを処理し、登録の各ステップの後に、セッションへのクラス

私はMVC3/EF4.1で自分の足を濡らしています。私の初期の情報収集では、リポジトリとこれを処理するための作業パターンを見ていました。しかし、私はリポジトリパターンがMVC3/Ef4.1では本当に必要ではないと言っているいくつかのソースを見ています。

私の質問はこれです。 MVC3/EF4.1を使用して複数のページにまたがるフローを新規ユーザーとして登録するより良い方法があります。/views。

答えて

3

私たちのMVC3登録は、類似エンティティ(ユーザー/個人/ロール/施設との所属)との複数のページビュー(プログレッシブ開示)にまたがっています。リポジトリやUnitOfWorkのパターンを完全に把握しているかどうかはわかりません。これらは永続性関連のパターンであり、実際にはHTTP状態管理メカニズムであるセッションとは関係ありません。

すべてのデータをセッションに集めるのではなく、各ページビューの最後に(ユーザーがフォームを送信するときに)データベースに書き込むことをお勧めします。鎖のあるビューから別のビューに情報を渡す必要がある場合は、コントローラのTempDataディクショナリを使用してエンティティキーを格納できます(TempDataは実際にはバックグラウンドでSessionを使用します)。

ユーザーがすべての登録手順を完了していない場合、この方法でデータベースに不完全な情報が残る可能性があります。ただし、情報の再入力をせずに登録プロセスを続けることができます。セッションを使用していて、ユーザーが誤ってブラウザウィンドウを閉じた場合、そのセッションデータはすべて失われ、ユーザーはやり直す必要があります。

私たちが行うことは、ユーザー&パスワードを最初に収集することです。

  1. 資格、確認メールが
  2. ユーザーが電子メールで送信秘密(フォーム2)を使用して電子メールアドレスを確認アドレスに送信された場合、ユーザーは電子メールアドレス(フォーム1)
  3. に入る
  4. ユーザー:流れはこのように書きます作成したパスワード(フォーム3)
  5. ユーザーが個人情報を入力する(フォーム4)
  6. ユーザーは、ビジネス情報を入力する(フォーム5)

ユーザーがこれらのステップのサブセットを完了している場合は、データベース情報を使用して、登録プロセスの次のステップを判断し、登録プロセスが完了するまでその情報をそのビューに流し込むことができます。

+0

興味深い。私たちは、部分的または放棄された登録の発生を防ぐために、各ステップでデータベースに書き込むことを避けようとしていたと思います。私はちょうど1つのページから次のページに渡すための大きなモデルを作成し、それぞれのページは登録のそのステップに関連するプロパティを入力するという考えがありました。 – Michael

+1

あなたはまだページロードの間にそのモデルを保存するためにそのモデルを保存しなければならなくなります(あなたがまだセッションを考えていると仮定します)。部分的または放棄された登録を防ぐためにDBへの書き込みを避ける場合は、どうしてですか?正当な理由でこれを正当化することができれば、各ステップでデータを格納するためにdb内に別々のエンティティを作成することができます。次に、プロセスが完了したら、データを「実際の」エンティティに移動します。この方法では、セッションがサーバーのメモリを大量に消費することはありません。 – danludwig

+0

は文字領域が不足しています。回答 – Michael

1

コメントレスポンスで文字数が不足しています。私はこれのような何かをすることができますか?

[HttpGet] 
public ActionResult UserInfo(RegistrationViewModel model) 
{ 
    return View(model); 
} 

[HttpPost] 
public ActionResult UserInfo(RegistrationViewModel model) 
{ 
    return View("BusinessInfo",model); 
} 

[HttpGet] 
public ActionResult BusinessInfo(RegistrationViewModel model) 
{ 
    return View(model); 
} 

[HttpPost] 
public ActionResult BusinessInfo(RegistrationViewModel model) 
{ 
    return View("LicenseAgreement",model); 
} 

[HttpGet] 
public ActionResult LicenseAgreement(RegistrationViewModel model) 
{ 
    return View(); 
} 
+0

Webフォームのフラッシュバック! RegistrationViewModelで検証をどのように実装しますか? UserInfoアクションで送信すると、無効なフィールドによりModelState.IsValidがfalseになります。また、どのようにしてRegistrationViewModelデータをBusinessInfo HttpGetアクションメソッドに渡しますか? – danludwig

+0

あなたは非常に良い点を挙げています。推奨される実装は、大きなエンティティを作成し、そのエンティティにサブミット/更新するビューモデルを持つことでしょうか? – Michael

+1

これは一つのアプローチですが、私はそれが最も簡単であるかどうかはわかりません。私が言及したように、私たちのために、エンティティデータを複製して、すべてを得るかどうかを確認することはありません。私たちはそれを考えましたが、dbに保存する前に登録が完了するまで待つことを正当化する正当な理由は見つかりませんでした。電子メールエントリを作成した後、ユーザ/パスワードエントリを作成し、その後に人物エントリを作成し、次に提携エントリを作成します。 db内のデータを使用して、どのステップがプロセスの次のステップであり、どのデータが古く/安全にパージできるかを判断できます。 – danludwig

関連する問題