7
votes

Actions de contrôleur MVC - Poignée de la poignée et obtenez-vous avec le code dupliqué

Je travaille sur cette application MVC 3 Razor et utilise généralement des modèles de vue pour mes vues.

Un nombre équitable de mes modèles de vue contient plus d'informations que l'entité particulière que j'interagie dans ma forme. Donc, mon gestionnaire d'action GET doit introduire le modèle d'affichage et fournir à chaque propriété la valeur souhaitée, etc.

Dans mon manutention d'action post, je vérifie si l'état modèle est valide, sinon je redisplayez le formulaire / la vue avec des erreurs.

Dans mon manuel d'action post, je me trouve avoir à copier le code de mon gestionnaire d'action Get Atter afin de reporter la vue. Comment puis-je implémenter mes actions de contrôleur afin de ne pas avoir à copier le code qui est responsable de la collecte des données du modèle de vue?

J'ai essayé d'autoriser mon gestionnaire d'action à gérer les deux post et à obtenir, mais j'ai ensuite les paramètres d'entrée à traiter. Mon gestionnaire d'action post sera le modèle d'affichage en tant que paramètre d'entrée mais pour le gestionnaire d'action de GET ne sera pas.


2 commentaires

Pourriez-vous fournir quelques exemples du code que vous écrivez actuellement?


Avez-vous essayé simplement de rediriger l'action postale pour obtenir une action?


5 Réponses :


4
votes

Dans les situations comme celles-ci, nous créons des constructeurs pour nos modèles de vue.

Jetez un coup d'œil à l'option 3 sous cet article .


1 commentaires

Bien que le code référencé n'utilise pas le constructeur dans les actions de get et post, comme j'aurais pu s'attendre à ce que je voudrais, je pense que la création de constructeurs pour la viewModel est une bonne solution pour cela.



-1
votes

Votre méthode d'action post-action doit être capable de simplement que le type de visionnage est le paramètre, au lieu de toutes les pièces de données individuelles. Si la viewModel est plus complexe à construire, vous voudrez peut-être écrire un modèle de modèle pour votre modèle de vue pouvant faire ce travail plus complexe (votre méthode d'action prendrait toujours le type VM comme paramètre).

[HttpPost]
public ViewResult MyAction(MyViewModel model) {
  // model should now be fully populated; check ModelState.IsValid though in case there are errors (such as the user entering "abc" for an int property)
}


0 commentaires

7
votes

Votre gestionnaire de poste peut renvoyer l'actionRésult à partir du gestionnaire d'obtention, comme suit: xxx

puisque le modèle de modèle contient tous les messages d'erreur (et une entrée non valide), la page d'obtention va montrer normalement.


0 commentaires

0
votes

Vous pouvez simplement refroidir le code commun dans une méthode d'extension sur l'entité principale que vous travaillez.

Appelez-le autant de fois que vous le souhaitez tout en restant sec .

Je ne sais pas précisément quelle est la fonction de ce code commun, mais surtout ce sera des données connexes pour une présentation riche. Dans ce cas, la solution que je préfère, c'est de laisser la vue charger les données supplémentaires d'une autre action à l'aide de renderaction, qui peut être refactable ultérieure à la mise à jour de la page Ajax Rester sec


0 commentaires

0
votes

"... Je me trouve avoir à copier le code ..."

Je ne comprends pas pourquoi; Pourquoi ne pouvez-vous pas créer simplement un membre dans votre contrôleur et l'appeler? Tout dans votre contrôleur ne doit pas être une action. Mais vous voudrez peut-être regarder les constructeurs à la place car @ataddeini suggéré.


0 commentaires