ASP.net MVC – Un ViewModel par vue ou par action?

Est-il préférable d’avoir un seul ViewModel par vue ou une action par contrôleur?

Exemple:

public ProjectController : Controller { public ActionResult Edit(int id) { var project = ...; return View(new ProjectEditViewModel(project)); } [HttpPost] public ActionResult Edit(ProjectEditViewModel model) { } **OR** [HttpPost] public ActionResult Edit(Project model) { } [HttpPost] public ActionResult Edit(ProjectEditPostViewModel model) { } } 

Voici les trois options, quelle est la meilleure?

  1. Utilisez le même ViewModel pour mes actions POST / GET.
  2. Utilisez un ViewModel pour mon action GET et mon modèle de domaine pour mon action POST.
  3. Utilisez un ViewModel différent pour GET et un ViewModel différent pour POST.

L’utilisation d’un modèle de vue différent pour les actions GET et POST constitue la meilleure et la plus souple des conceptions. Mais utiliser le même modèle de vue pour les actions GET et POST fonctionne également dans 90% des cas et constitue une bonne conception. Donc, si le même modèle de vue fonctionne dans votre scénario, n’hésitez pas à le réutiliser comme ceci.

Dans le cas où différents modèles de vue sont utilisés pour les actions GET et POST, il existe encore une relation entre ces classes: inheritance ou composition.

La bonne réponse

Ni l’un ni l’autre . Il n’y a pas de solution miracle et ne devrait pas l’être.

La bonne réponse est donc: utilisez autant de modèles de vues que votre processus d’interface utilisateur le demande . C’est indépendamment des vues ou des actions du contrôleur.

Parfois, une action demande une vue, d’autres une vue. Mais ne suivez pas les directives ssortingctes qui entraveraient votre développement. Les modèles de vue viendront naturellement au fur et à mesure que vous développerez votre application. Et devrait. Sinon, vous risquez de vous retrouver avec des vues déraisonnables basées sur certaines directives que vous avez définies.

C’est en fait une réponse similaire à celle de @ DarinDimitrov, mais avec une conclusion directe.

Utilisez un modèle différent pour recevoir des parameters d’entrée dans l’action Post (je ne l’appelle même pas ViewModel dans ce cas) que pour transmettre des parameters de sortie à la vue.

De cette façon, vous pouvez personnaliser exactement quels parameters d’entrée acceptez-vous.

Je suis cette approche pour les formes de base:

  • Modèle à vue unique pour le GET
  • Modèle à vue unique pour le POST

Le modèle GET hérite du modèle POST.

Je vais souvent passer un object de domaine au constructeur du modèle GET et faire 2 choses avec lui:

  1. Remplissez les propriétés du modèle POST avec les données de l’object de domaine.
  2. Encapsulez l’object de domaine en tant que variable locale dans le modèle GET. J’utilise ceci pour afficher des données (en lecture seule) à partir de l’object de domaine. Enregistre un peu d’effort. Certaines personnes vous diront de ne pas le faire.