10
votes

RedirectToaction (..) avec un objet profond complexe échoue

J'essaie de transmettre un objet d'une action du contrôleur à un autre. L'objet que je passe autour semble plus ou moins comme ceci: xxx

mon contrôleur ressemble à ceci: xxx

la méthode de résultat échoue avec une exception de pointeur NULL puisque la liste des phonumbers est soudainement nulle après avoir invoqué l'action de résultat avec la méthode redirectoaction ().

a vu ce type de comportement avant?

acclamations,

Peter


0 commentaires

4 Réponses :


8
votes

Avez-vous vraiment besoin de rediriger vers l'autre action? RedirectToaction provoque une nouvelle demande HTTP, laquelle est la raison pour laquelle Tempdata fonctionne. Ne pouvions pas simplement appeler le résultat résultat directement comme celui-ci? XXX

EDIT Sauf si votre application fait plus que ce que vous avez Montré dans la question, il ne semble pas que vous ayez vraiment besoin de l'action index. Vous pouvez déplacer le code qui crée une nouvelle personne en une méthode privée CreePerson . Dans votre résultat action si personne est NULL, puis appelez la méthode Creeaperson . L'action index pourrait être éliminée tout à fait, mais cela nécessiterait de modifier vos itinéraires. Ou simplement laisser renvoyer redirecttoaction ("résultat", "dialogue"); est la seule ligne de code dans votre index action.

réellement, suivant La séparation des préoccupations MVC, que CreeEpperson devrait probablement être une méthode à l'intérieur de votre code modèle. Le contrôleur n'a pas besoin de contenir la logique de créer une nouvelle personne . Qui appartient vraiment au modèle.


1 commentaires

Bonjour Dennis, merci pour la réponse. Vous avez totalement raison de la création des objets de la personne. Merci!



5
votes

Je suis d'accord avec @dennis - sauf si vous voulez que l'URL change, vous devrez penser à autre chose. La raison en est que RedirectToaction ne sérialiste pas les données, il itière simplement sur les propriétés de l'objet Valeurs de route construit une chaîne de requête avec les touches étant les noms de propriété et les valeurs de la représentation de la chaîne des valeurs de propriété. Si vous souhaitez que l'URL change, vous utilisez TEMPDATA est probablement le moyen le plus simple de le faire, bien que vous puissiez également stocker l'élément de la base de données, transmettez-le sur la méthode de résultat et de le reconstituer à partir de là.


1 commentaires

Bonjour, j'ai fini par utiliser le tour de Tempdaata pour transférer des objets d'une action à l'autre. Merci d'avoir effacé la vérification de la redirection. C'était la vraie partie déroutante pour moi.



2
votes

Bien que ce soit une vieille question, j'ai trouvé un une excellente réponse à celle-ci dans ce que je crois est une question en double. La clé est le constructeur routévalueddictionnerricomandiction.

return RedirectToAction("Result", "Dialog", new RouteValueDictionary(person))


0 commentaires

0
votes

Pour tout le monde, cela doit vraiment appeler une action et renvoyer une vue d'un autre contrôleur avec un objet complexe et ne voulez pas (ni ne peut pas) passer à l'objet dans templdata . J'utilise dans mon application très laid mais solution de travail: xxx

inspiré par la réponse trouvée ici: https: //stackoverflow.com/a/4360019/1341409


0 commentaires