modèle c # mvc vs viewbag

Supposons que vous ayez une liste de personnes A et une liste de personnes B dans une page. Et ces deux classes sont des classes séparées dans L2S, représentant deux tables différentes. Par conséquent, vous ne pouvez pas transmettre un seul modèle comme suit:

... @model PeopleA ... @foreach(var peopleA in Model.People) ... @foreach(var peopleB in //what?) 

En conséquence, je suppose, j’ai trois options à suivre.

  • La première consiste à diviser la page en vues partielles afin que je puisse passer un modèle via l’aide de RenderAction . Étant donné que je n’utiliserai ces vues partielles qu’une fois, cette option ne semble pas m’attirer.
  • La deuxième option serait d’utiliser ViewBags, ce que je ne souhaite pas, car je préfère les modèles fortement typés.
  • Le dernier, enfin, que je m’apprêtais à utiliser mais que je voulais demander avant de le faire, consiste à créer un modèle comme suit:

ModelMyPage.cs

 public List peopleA { get; set; } public List peopleB { get; set; } 

MyController.cs

 ... ModelMyPage m = new ModelMyPage(); m.peopleA = // query m.peopleB = // another query return(m); 

Et vous avez eu l’idée. Est-ce la bonne façon d’accomplir ma tâche ou existe-t-il une meilleure façon de faire ce que je veux?

Créer un ViewModel spécifique à la page, car votre option 3 est la façon dont je le ferais.

Je crois que c’est aussi l’approche recommandée.

Non, il n’y a pas de meilleure idée. Dans asp.net MVC, M signifie ViewModels, pas les modèles Business, Domain. Il est recommandé de créer ViewModels pour vos vues et l’utilisation de modèles commerciaux n’est pas recommandée. Vous devez concevoir vos ViewModels pour répondre au besoin d’interactions de contrôleur avec Domain, et à partir de contrôleur pour afficher les interactions.

Je le ferais de la troisième manière. De plus, si vous voulez rendre un code HTML identique pour chaque personne des deux tableaux, je les concaténerais avant forfor:

 var person in Model.PeopleA.Concat(Model.PeopleB) 

Vos première et troisième options semblent correctes.

ad 1) “ne les utilise qu’une fois” n’est pas un bon argument contre. Utilisez les vues partielles pour organiser les vues.

ad 2) Utilisez Viewbag pour append de petits éléments, comme une liste de recherche.

ad 3) Les modèles de vue sont (deviennent) courants dans MVC. C’est probablement la meilleure approche.

Je crée habituellement un modèle pour la page et le nomme comme tel, par exemple AccountDetailsPageModel . Ensuite, d’autres modèles peuvent en être les propriétés pour les pages complexes.