multi-étape du processus d'enregistrement de questions asp.net mvc (split viewmodel, modèle unique)
J'ai un multi-étape du processus d'enregistrement de, soutenu par une objet unique dans le domaine de la couche de, qui ont des règles de validation défini sur propriétés.
Comment valider le domaine de l'objet lorsque le domaine est divisé en de nombreux points de vue,
et je dois économiser de l'objet partiellement dans le premier moment de leur publication?
J'ai pensé à utiliser les Sessions, mais ce n'est pas cause possible le processus est long et la quantité de données est élevé, Donc je ne veux pas utiliser la session.
J'ai pensé à propos de l'enregistrement de toutes les données dans un relationnel-mémoire db (avec le même schéma que principal db) puis rinçage des données db principaux mais les questions surgi parce que je devrait la route entre les services (demandé dans les points de vue) qui travaillent avec les principaux db et en mémoire db.
Je suis à la recherche d'un élégant et propre solution (plus précisément, une meilleure pratique).
Mise à JOUR ET Précisions:
@Darin Merci pour votre aimable réponse,
C'est exactement ce que j'ai fait jusqu'à maintenant.
Mais d'ailleurs j'ai une demande qui ont beaucoup de pièces jointes à elle, j'ai concevoir un Step2View
par exemple, l'utilisateur qui peut télécharger des documents de manière asynchrone ,
mais ces pièces jointes doivent être enregistrées dans une table avec référentielle rapport à une autre table qui doit avoir été enregistré avant dans Step1View
.
Donc je devrais sauver le domaine de l'objet dans Step1
(en partie), Mais je ne peux pas,
cause la sauvegarde de Domaine de Base de l'objet qui est lié en partie à une Étape 1 du ViewModel peut pas être sauvé sans les accessoires qui viennent de convertis Step2ViewModel
.
- la grande question Jani
- Avez-vous jamais trouver le téléchargement de cette pièce? J'aimerais reprendre votre cerveau. Je suis en train de travailler sur ce problème précis.
- La solution dans ce blog c'est assez simple et direct. Il utilise des divs en tant que "mesures" par swithing leur visibilité et discrète jquery de validation.
- double possible de exemple de MVC3 Assistant Apps (en plusieurs étapes) (PAS de JQUERY)
Vous devez vous connecter pour publier un commentaire.
D'abord, vous ne devriez pas être à l'aide de n'importe quel domaine d'objets dans vos vues. Vous devriez être en utilisant les modèles de vue. Chaque modèle de vue contiendra uniquement les propriétés qui sont requis par la vue ainsi que la validation des attributs spécifiques à ce point de vue. Donc, si vous avez 3 étapes de l'assistant, cela signifie que vous aurez 3 modèles de vue, un pour chaque étape:
et ainsi de suite. Tous ces modèles de vue pourrait être soutenu par la principale de l'assistant de modèle de vue:
vous pourriez avoir des actions de contrôleur rendu de chaque étape de la procédure de l'assistant et en passant le principal
WizardViewModel
à la vue. Lorsque vous êtes sur la première étape à l'intérieur de l'action de controller vous pourriez initialiser leStep1
de la propriété. Puis à l'intérieur de la vue qui vous permettrait de générer le formulaire permettant à l'utilisateur de remplir les propriétés de l'étape 1. Lorsque le formulaire est soumis à l'action du contrôleur va appliquer les règles de validation de l'étape 1 uniquement:Maintenant à l'intérieur de l'étape 2 de la vue, vous pouvez utiliser les Html.Sérialiser helper de MVC futures afin de sérialiser l'étape 1 dans un champ caché à l'intérieur de la forme (une sorte de ViewState si vous le souhaitez):
et à l'intérieur de l'action POST de step2:
Et ainsi de suite jusqu'à ce que vous arrivez à la dernière étape où vous aurez la
WizardViewModel
rempli avec toutes les données. Ensuite vous aurez la carte de la vue modèle de votre modèle de domaine et de le transmettre à la couche de service pour le traitement. La couche de service peut effectuer toutes les règles de validation de lui-même et ainsi de suite ...Il y a aussi une autre solution: à l'aide de javascript et de mettre tous sur la même page. Il y a beaucoup de les plugins jquery là-bas qui fournissent la fonctionnalité de l'assistant (Stepy est une belle). C'est essentiellement une question de montrer et de cacher les divs sur le client, dans ce cas, vous n'avez plus besoin de vous inquiéter de la persistance de l'état entre les étapes.
Mais n'importe quelle solution vous choisissez toujours utiliser des modèles de vue et d'effectuer la validation de ces modèles de vue. Tant que vous êtes collant annotation de données attributs de validation de votre domaine de modèles vous permettra de combat très dur que les modèles de domaine ne sont pas adaptées à la vue.
Mise à JOUR:
OK, en raison des nombreux commentaires que j'ai tirer la conclusion que ma réponse n'était pas claire. Et je dois dire. Donc, laissez-moi essayer de développer mon exemple.
Nous pourrions définir une interface qui tous les modèles de vue devraient mettre en œuvre (c'est juste un marqueur de l'interface):
ensuite, nous définissons les 3 étapes de l'assistant, où chaque étape de cours contiennent uniquement les propriétés qu'il exige ainsi que les attributs de validation:
ensuite, nous définissons le principal assistant de modèle de vue qui consiste en une liste d'étapes et une étape actuelle de l'indice:
Alors nous passons à la manette:
Quelques remarques à propos de ce contrôleur:
[Deserialize]
attributs de Microsoft à Terme de bibliothèque donc, assurez-vous d'avoir installé leMvcContrib
NuGet. C'est la raison pour laquelle les modèles de vue doit être décoré avec de la[Serializable]
attributIStepViewModel
interface pour ce qui est logique nous avons besoin d'un modèle de liaison personnalisé.Voici le modèle associé classeur:
Ce classeur utilise un champ caché appelé StepType qui contiendra le type concret de chaque étape et à qui nous enverrons à chaque demande.
Ce modèle de classeur sera enregistré dans
Application_Start
:Le dernier morceau du puzzle sont les points de vue. Voici les principaux
~/Views/Wizard/Index.cshtml
vue:Et c'est tout ce que vous devez faire ce travail. Bien sûr, si vous vouliez vous pourriez personnaliser l'aspect et la convivialité de certaines ou de toutes les étapes de l'assistant par la définition d'un éditeur personnalisé modèle. Pour exemple, nous allons le faire pour l'étape 2. C'est pourquoi nous définissons un
~/Views/Wizard/EditorTemplates/Step2ViewModel.cshtml
partielle:Voici comment la structure ressemble à:
Bien sûr, il y a place à l'amélioration. L'Indice action POST ressemble à s..t. Il y a trop de code. Une autre simplification consisterait en déplacement de toutes les infrastructures des trucs comme indice, indice actuel de la gestion, de la copie de l'étape en cours dans l'assistant, ... dans un autre modèle de classeur. De sorte que, finalement, nous nous retrouvons avec:
qui est de plus comment les actions POST devrait ressembler. Je quitte cette amélioration pour la prochaine fois 🙂
public List<int> Students { get; set; }
dans l'une de vos étapes, ce qui serait@Html.EditorFor
montrer sur cette étape?@Html.Serialize()
et[Deserialize]
attribut de travail.À compléter sur Amit Bagga réponse, vous trouverez ci-dessous ce que j'ai fait. Même s'il est moins élégant je trouve cela plus simple qu'Darin réponse.
Contrôleur :
Modèles :
Je vous suggère de maintenir l'état des Processus Complet sur le client à l'aide de Jquery.
De cette façon, vous pouvez facilement construire votre domaine d'objet directement à partir de la forme de données de postes et dans le cas où les données des erreurs de retour JSON valide la tenue de tout le message d'erreur et de les afficher dans un div.
Veuillez diviser les Étapes
Assistants sont de simples étapes dans le traitement d'un modèle simple. Il n'y a pas de raison de créer plusieurs modèles d'un assistant. Tout ce que vous avez à faire est de créer un modèle unique et de passer entre les actions d'un contrôleur unique.
Ci-dessus étudiante est stupide simples afin de remplacer vos champs là. Ensuite, nous commençons par une simple action qui lance notre assistant.
Cela appelle le point de vue "WizardStep1.cshtml (si vous utilisez un rasoir). Vous pouvez utiliser la créer un modèle de l'assistant si vous le souhaitez. Il nous suffit de rediriger le poste à une action différente.
La chose à noter est que nous publierons cette action; le WizardStep2 action
Dans cette action, nous vérifions si notre modèle est valide, et si oui, nous l'envoyer à notre WizardStep2.cshtml vue d'autre nous le renvoyer à l'étape de l'un avec les erreurs de validation. Dans chaque étape, nous l'envoyons à l'étape suivante, de valider cette étape et de passer. Maintenant, certains futés, les développeurs pourraient bien dire que nous ne pouvons pas déplacer entre les étapes comme si nous utilisons les attributs [Obligatoire] ou d'autres annotations de données entre les étapes. Et vous auriez raison, afin de supprimer les erreurs sur les points qui doivent encore être vérifiées. comme ci-dessous.
Nous avons finalement enregistrer le modèle, une fois à la banque de données. Cela empêche également d'un utilisateur qui démarre un assistant, mais n'a pas fini de ne pas enregistrer les données incomplètes à la base de données.
J'espère que vous trouverez cette méthode de la mise en œuvre d'un assistant beaucoup plus facile à utiliser et à entretenir que tout le mentionné précédemment méthodes.
Merci pour la lecture.
L'ajout de plus d'info de @Darin réponse.
Que faire si vous avez la séparation de la conception de style pour chaque étapes et voulait maintenir chaque séparées, vue partielle, ou si vous avez de multiples propriétés pour chaque étape ?
Tout en utilisant
Html.EditorFor
nous avons limitation de l'utilisation partielle de la vue.Créer 3 Vues Partielles en vertu de
Shared
dossier nommé :Step1ViewModel.cshtml , Step3ViewModel.cshtml , Step3ViewModel.cshtml
Par souci de concision, je viens de poster le 1er patial vue, d'autres étapes sont les mêmes que Darin réponse.
Step1ViewModel.cs
Step1ViewModel.cshtml
Index.cshtml
Si il y a une meilleure solution, s'il vous plaît commentaire à faire savoir aux autres.
Une option est de créer un ensemble de tableaux identiques qui va stocker les données recueillies à chaque étape. Puis dans la dernière étape, si tout va bien, vous pouvez créer le réel de l'entité en copiant les données temporaires et de les stocker.
Autre consiste à créer
Value Objects
pour chaque étape et de les stocker ensuite dansCache
ouSession
. Puis si tout va bien, vous pouvez créer votre objet de Domaine à partir d'eux et de les enregistrer