7
votes

Polymorphe ViewModel Collection et rendu des vues partielles MVC

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 commentaires

Vous pourriez avoir la page ProvinceDetail 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 de provinceDetail ou de chaque instanciation ? 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.


3 Réponses :


0
votes

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. XXX

À mon avis, je rends la vue partielle à l'aide d'une convention de dénomination: xxx

alors, je Demandez à un XXXEventemail d'implémentation d'IbusinessEventMail avec l'événementCode XXX et une vue partielle _XXX.CSHTML


0 commentaires

1
votes

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 exportmetadata ​​code> attribue qui désigne le nom de la vue à utiliser. . Par exemple: p> xxx pré>

élargir votre htmlhelper code> avec les partiel suivant code> méthode: p> xxx PRE>

Puis utilisez-le: p>

@Html.Partial(currentProvince, "Partials/")


0 commentaires

2
votes

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)
}


0 commentaires