J'ai un problème avec une collection polymorphe de formes de visiteurs dans mon application MVC. J'ai reçu ceci via un appel de service Web et j'ai besoin de les utiliser à travers eux et de leur donner sa propre vue partielle, basée sur le type d'objet.
ICollection<ProvinceViewModel> ProvinceList; // collection receive via service @for (int i = 0, c = ProvinceList.Count; i < c; i++) { var currentProvince = this.Model.ElementAt(i); @switch (additionalRegistry.Code) { case "QC": @Html.Partial("AlbertaDetail", (QuebecViewModel)currentProvince) break; case "ON": @Html.Partial("OntarioDetail", (OntarioViewModel)currentProvince) break; default: @Html.Partial("ProvinceDetail", ProvinceViewModel) break; } }
3 Réponses :
J'ai eu une exigence similaire et c'est ainsi que j'ai réussi à résoudre ce problème.
Mon viewModel (BusinessEventMailViewModel) dispose d'une liste d'interfaces (ibusinesseventemail) résolue au moment de l'exécution de l'unité. Un ibusinesseventemail a une propriété EventCode. À mon avis, je rends la vue partielle à l'aide d'une convention de dénomination: p> alors, je Demandez à un XXXEventemail d'implémentation d'IbusinessEventMail avec l'événementCode XXX et une vue partielle _XXX.CSHTML P> P>
Après avoir rencontré le même problème dans le passé, j'ai créé la solution suivante:
Premièrement, décorer votre modèle de visualisation (béton) avec élargir votre Puis utilisez-le: p> exportmetadata code> attribue qui désigne le nom de la vue à utiliser. . Par exemple: p>
htmlhelper code> avec les
partiel suivant code> méthode: p>
@Html.Partial(currentProvince, "Partials/")
Vous pouvez y parvenir avec des modèles d'affichage. Créez un modèle d'affichage pour chaque type dans le dossier DisplayTemplates dans le répertoire de visual de votre contrôleur:
@model ICollection<ProvinceViewModel> @foreach (var province in Model) { @Html.DisplayFor(_ => province) }
Vous pourriez avoir la page code> ProvinceDetail Code> Faites-la à la place pour traiter les différentes provinces de manière appropriée? Cela vous permettrait de garder la logique sur cette page au lieu de devoir le répéter si vous les utilisez ailleurs
Ce n'est pas clair: avez-vous besoin d'instancier une vue partielle pour chaque de type concret i> de provinceDetail ou de chaque instanciation i>? Il semble tout simplement étrange que vous ayez plusieurs vues partielles de QuébecDetail, par exemple.
Désolé, j'ai essayé de simplifier l'exemple. J'ai besoin d'instancier une vue partielle pour chaque province qui a des propriétés différentes. Par exemple, l'Ontario, le Québec, le Manitoba, BC ont tous une vue partielle spécifique et différente, tout le reste obtient une vue générique standard par défaut, c'est-à-dire. ProvinceDetail. Le résultat sera une liste des provinces et de leurs détails sur la page principale.