2011-12-06 3 views
1

Je suis donc au point dans mon projet où je dois implémenter un système d'enregistrement d'utilisateur pour une application MVC 3 avec Entity Framework.Comment gérer l'enregistrement des utilisateurs avec plusieurs pages et entités

J'ai les entités suivantes qui sont/doivent être remplis dans le cadre des inscriptions:

  • utilisateur
  • Personne
  • Rôle
  • affaires

L'ancienne application (nous l'appellerons v1) manipulé le processus d'inscription avec une classe pour contenir toutes les données, puis après chaque étape de l'enregistrement, enregistré le classe à session

Je mets juste mes pieds mouillés avec MVC3/EF4.1. Mon premier balayage pour l'information m'a fait regarder un référentiel, et un modèle de travail pour gérer cela. Cependant, je vois quelques sources qui disent que les modèles de dépôt ne sont pas vraiment nécessaires avec MVC3/Ef4.1.

alors ma question est la suivante. puis-je créer un enregistrement utilisateur comme en v1, et cette classe sauvegardée en session est maintenant techniquement un référentiel, ou existe-t-il un meilleur moyen d'exploiter MVC3/EF4.1 pour gérer l'enregistrement d'un nouvel utilisateur avec un flux qui s'étend sur plusieurs pages/vues.

Répondre

3

Notre enregistrement MVC3 s'étend sur plusieurs pages vues (divulgation progressive) avec des entités similaires (Utilisateur/Personne/Rôles/Affiliation avec des établissements). Je ne suis pas sûr si vous avez une compréhension complète sur les modèles Repository ou UnitOfWork si. Ce sont des modèles liés à la persistance, qui n'ont rien à voir avec la session, qui est un mécanisme de gestion d'état HTTP.

Je vous suggère d'écrire dans la base de données à la fin de chaque page vue (lorsque l'utilisateur soumet le formulaire), plutôt que d'accumuler toutes les données en session. Si vous devez transmettre des informations d'une vue à une autre dans la chaîne, vous pouvez utiliser le dictionnaire TempData du contrôleur pour stocker les clés d'entité (TempData utilise réellement Session en arrière-plan).

Il est possible que vous obteniez des informations incomplètes dans la base de données avec cette approche, si un utilisateur n'effectue pas toutes les étapes d'enregistrement. Cependant, cela vous permet de les laisser continuer le processus d'inscription sans avoir à ressaisir les informations. Alors que si vous utilisiez une session et que votre utilisateur fermait accidentellement la fenêtre de son navigateur, toutes les données de session seraient perdues et l'utilisateur devrait recommencer.

Ce que nous faisons est de recueillir d'abord l'utilisateur & mot de passe.Le flux se présente comme suit:

  1. L'utilisateur entre l'adresse e-mail (formulaire 1)
  2. Si vous êtes admissible, e-mail de confirmation est envoyé à l'adresse
  3. utilisateur confirme l'adresse e-mail en utilisant un secret envoyé par courrier électronique (formulaire 2)
  4. utilisateur crée un mot de passe (forme 3)
  5. L'utilisateur entre les informations personne (formulaire 4)
  6. utilisateur entre d'affaires (formulaire 5)

Si un utilisateur n'a terminé qu'un sous-ensemble de ces étapes, nous pouvons utiliser les informations de la base de données pour déterminer quelle étape est la suivante dans le processus d'enregistrement et les canaliser dans cette vue jusqu'à la fin du processus d'enregistrement.

+0

intéressant. Je pense que nous essayions d'éviter l'écriture dans la base de données à chaque étape pour éviter une occurrence d'enregistrement partielle ou abandonnée. J'ai juste eu l'idée de créer un grand modèle pour passer d'une page à l'autre, et chaque page remplit alors les propriétés liées à cette étape d'enregistrement. – Michael

+1

Vous devrez quand même enregistrer ce modèle pour le conserver entre les chargements de pages (supposons que vous pensez toujours à la session). Si vous évitez d'écrire à la base de données pour éviter les enregistrements partiels ou abandonnés, pourquoi? Si vous pouvez justifier cela avec de bonnes raisons, vous pouvez créer des entités séparées dans votre base de données pour stocker des données à chaque étape. Ensuite, lorsque le processus est terminé, déplacez les données vers les entités "réelles". De cette façon, vous ne finissez pas avec la session monopolisant la mémoire sur votre serveur. – danludwig

+0

a manqué d'espace de caractère. voir la réponse – Michael

1

a manqué de caractères dans la réponse aux commentaires. puis-je faire quelque chose comme ça?

[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

Webforms flashback! Comment implémenteriez-vous la validation sur votre RegistrationViewModel? Si vous l'envoyez dans l'action UserInfo, les champs non valides provoqueront la fausse valeur de ModelState.IsValid. De même, comment passeriez-vous les données RegistrationViewModel à la méthode d'action BusinessInfo HttpGet? – danludwig

+0

vous soulevez de très bons points. l'implémentation recommandée serait donc de créer une grande entité et avoir des modèles de vue qui soumettent/mettent à jour à cette entité? – Michael

+1

C'est une approche, même si je ne suis pas sûr que ce soit le plus simple. Comme je l'ai mentionné, pour nous, nous ne dupliquons pas les données de l'entité pour nous assurer que nous obtenons tout ou rien. Nous l'avons considéré, mais n'avons pas pu trouver une bonne raison pour justifier l'attente jusqu'à ce que l'enregistrement soit complet avant d'enregistrer au db. Nous créons une entrée email, puis une entrée utilisateur/mot de passe, puis une entrée personne, puis une entrée d'affiliation. En utilisant les données de la base de données, nous pouvons déterminer quelle étape est la suivante dans le processus et quelles données sont périmées/peuvent être purgées en toute sécurité. – danludwig

Questions connexes