2013-02-21 3 views
0

Je crée un processus en plusieurs étapes de type Assistant dans une application Web ASP.NET MVC 4. J'utilise TempData pour conserver les informations des étapes précédentes, car l'assistant n'est pas strictement linéaire: les choix de l'utilisateur sur la première page lui permettent de voir l'une des trois options de la troisième page. J'y parviens en utilisant leur choix pour affecter l'une des trois classes dérivées à une propriété de classe de base sur le viewmodel de cette troisième page. La page elle-même utilise ensuite un classeur de modèle personnalisé pour me permettre d'utiliser @Html.EditorFor(m => m.BaseContainer) et le faire afficher le bon modèle pour l'utilisateur à remplir. Mon problème est que lorsque la troisième page POST, la méthode de contrôleur attend bien sûr une base- objet de classe, ce qui signifie que lorsque je l'enregistre dans TempData, il enregistre uniquement les propriétés de la classe de base.Passage de la classe dérivée autour de la propriété de classe de base sur le contrôleur

Je pourrais faire une série de vérifications le long des lignes de if (viewModel.BaseContainer is DerivedClass1), mais cela semble être un hack. Le point entier de l'abstraction dans l'utilisation de la classe de base est que le contrôleur n'a pas besoin de savoir lequel il est à ce stade. Existe-t-il un moyen plus élégant de sauvegarder l'objet sans perdre les propriétés de la classe dérivée?

+0

Avez-vous un code pour aider votre description? – CR41G14

Répondre

0

Nous avons abordé le même problème il y a plusieurs mois. Nous l'avons résolu en utilisant un modèle de vue plus petit pour chaque étape de l'assistant et, après une validation réussie, nous avons copié les valeurs dans un grand modèle de vue (contenant des propriétés pour tout dans l'assistant). Nous avons ensuite stocké ce grand modèle de vue dans TempData et progressé à l'étape suivante. Si vous ajoutez de nouvelles propriétés en dérivant de votre classe de base, alors vous étendez son interface, vous pouvez créer des interfaces supplémentaires pour les nouvelles propriétés dans chaque classe dérivée, mais cela ne semble pas une solution simple .

+0

Je fais quelque chose de similaire. Chaque étape du processus a son propre viewmodel, et il y a un objet qui décrit la requête entière que l'assistant construit. Après chaque étape, le controlleur extrait ce modèle de TempData, extrait les bits requis du POST et les ajoute à l'objet, puis le replace dans TempData. Mon problème est que dans cette étape, les bits requis ne sont accessibles que par leur classe de base. Je peux les ajouter à l'objet sans problème (il a la même propriété de classe de base) mais ils ne semblent pas enregistrer leurs propriétés uniques - juste celles de la classe de base. – anaximander

+0

Même si nous avons eu un problème similaire, nous avons finalement décidé d'utiliser la reliure automatique du modèle à chaque étape, en traduisant les valeurs dans le modèle de grande vue et en sauvant manuellement le grand modèle de vue à la fin. Je ne suis pas sûr que vous pouvez utiliser un classeur de modèle basé sur la classe de base et récupérer les propriétés supplémentaires sur les classes dérivées sans utiliser une sorte de réflexion (et cela pourrait être fait, il pourrait sembler salissant). Je ne suis pas expert en reliure, donc ce sera intéressant de voir si quelqu'un a plus d'infos. –

Questions connexes