IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web avec .NET Discussion :

Problème de compatibilité de type entre le controller et la vue


Sujet :

Développement Web avec .NET

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2013
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2013
    Messages : 254
    Par défaut Problème de compatibilité de type entre le controller et la vue
    Bonjour,
    Je travaille sur un projet ASP.NET en MVC. J'ai une table Opération qui a deux clés étrangères de deux autres tables.
    Je voudrais afficher la liste des opérations avec pagination et afficher en lieu et place des clés étrangère le libellé.
    Seulement, j'ai une erreur :
    nvalidOperationException: The model item passed into the ViewDataDictionary is of type 'BOCNEW_2025.Controllers.BOC_NEW.Pagination`1[BOCNEW_2025.Models.Operation]', but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.IEnumerable`1[BOCNEW_2025.Models.Operation]'..
    Je comprends qu'il s'agit d'un problème de compatibilité entre les données attendues par la vue et celles envoyées par le controller mais je n'arrive pas à résoudre le problème depuis hier.

    Model Opération
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public partial class Operation
    {
        [Display(Name = "Code émetteur")]
        [Required]
        public int CodeEmetteur { get; set; }
     
        [Display(Name = "Numéro opération")]
        public int NumeroOperation { get; set; }
     
        [Display(Name = "Code nature opération")]
        [Required]
        public int CodeNature { get; set; }
     
        [Display(Name = "Observation")]
        public string Observations { get; set; }
     
        [Display(Name = "Date d'enregistrement")]
        public DateTime? DateEnregistrement { get; set; }
     
        [Display(Name = "Date de diffusion")]
        public DateTime? DateDebutDiffusion { get; set; }
     
        [Display(Name = "Date de fin de diffusion")]
        public DateTime? DateFinDiffusion { get; set; }
     
        [Display(Name = "Document joint")]
        public string Document { get; set; }
     
        [NotMapped]
        public IEnumerable<SelectListItem> NatureOperation { get; set; }
     
        [NotMapped]
        public IEnumerable<SelectListItem> Emetteur { get; set; }
    }
    Model Pagination
    Pour la pagination, j'ai créé une classe générique qui prend en paramètres la source (model) sous la forme de List<T> et le nombre de page, la page active, etc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    public class PaginationViewModel<T> : List<T>
    {
        public int TotalItems { get; set; }
        public int PageActive { get; set; }
        public int NbreParPage { get; set; }
        public int TotalPage { get; set; }
        public int DebutPage { get; set; }
        public int FinPage { get; set; }
     
        public PaginationViewModel(List<T> items, int count, int pageIndex, int pageSize)
        {
            TotalItems = count;
            PageActive = pageIndex;
            NbreParPage = pageSize;
            TotalPage = (int)Math.Ceiling(count / (double)NbreParPage);
            DebutPage = pageIndex - 5;
            FinPage = pageIndex + 4;
     
            if (DebutPage <= 0)
            {
                FinPage = FinPage - (DebutPage - 1);
                DebutPage = 1;
            }
            if (FinPage > TotalPage)
            {
                FinPage = TotalPage;
                if (FinPage > 10)
                {
                    DebutPage = FinPage - 9;
                }
            }
            this.AddRange(items);
        }
     
        public bool PrecDesactive => PageActive > 1;
        public bool SuivDesactive => PageActive < TotalPage;
     
        public static PaginationViewModel<T> Create(List<T> source, int pageIndex, int pageSize) 
        {
            var count = source.Count;
            var items = source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
            return new PaginationViewModel<T>(items, count, pageIndex, pageSize);
        }
    }
    Le Controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public ActionResult Index(int NumPage)
    {
        int NbreParPage = 10;
        //On réinitialise le numéro de page à 1 si le numéro est égal ou inférieru à 1
        if (NumPage < 1)
            NumPage = 1;
     
        var operations = _context.Operations
            .Include(o => o.NatureOperation)
            .Include(o => o.Emetteur)
            .ToList();
     
        return View(PaginationViewModel<Operation>.Create(operations, NumPage, NbreParPage));
    }
    La page cshtml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    @model BOCNEW_2025.Models.PaginationViewModel<BOCNEW_2025.Models.Operation>
    @foreach (var item in Model) {
    <tr>
        <td class="col-1" style="width:5%; text-align:right;">
                @Html.DisplayFor(modeltem => item.CodeEmetteur)
        </td>
        <td class="col-1" style="width:5%; text-align:right;">
                @Html.DisplayFor(modelItem => item.Emetteur)
        </td>
         <td class="col-3" style="width:3%; text-align:right;">
                @Html.DisplayFor(modelItem => item.CodeNature)
        </td>
            <td class="col-4" style="width:15%">
                @Html.DisplayFor(modelItem => item.DateDebutDiffusion)
        </td>
            <td style="width:15%">
                @Html.DisplayFor(modelItem => item.DateFinDiffusion)
        </td>
            <td style="width:30%">
                @Html.DisplayFor(modelItem => item.Observations)
            </td>
            <td style="width:15%">
            <button type="button" class="btn btn-primary"><a asp-action="Edit" asp-route-id="@item.NatureOperation" class="text-white">Modifier</a></button>
            <button type="button" class="btn btn-danger"><a asp-action="Delete" asp-route-id="@item.NatureOperation" class="text-white">Supprimer</a></button>
        </td>
    </tr>
    }

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 400
    Par défaut
    Hello,

    je n'arrive pas à résoudre le problème depuis hier.
    Oui, parce-que les problèmes sont multiples...

    et que ça devient compliqué quand le projet grossi, les corrections apportées vont impactés tous les fichiers de votre projet.

    De notre côté on peut pas faire grand chose... il faut découper vos tâches, tester séparément et une fois tout cela bien vérifié, faire les interactions nécessaires entre chacun de vos fichiers.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2013
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2013
    Messages : 254
    Par défaut
    Merci, j'ai suivi tes conseils et je suis arrivé à ça
    J'ai ajouter deux attributs qui non mappé (libellé des ID) à mon model et modifier mon controller en faisant une jointure sur les tables. ça fonctionne mais, je ne suis pas sur que c'est la meilleure méthode pour optimiser.

    Controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    var filtreOperations = from o in _context.Operations
            join n in _context.NatureOperations on o.CodeNature equals n.CodeNature
            join e in _context.Emetteurs on o.CodeEmetteur equals e.CodeEmetteur
            select new Operation
            {
                numero_operation = o.numero_operation,
                CodeEmetteur = o.CodeEmetteur,
                NumeroOperation = o.NumeroOperation,
                CodeNature = o.CodeNature,
                Observations = o.Observations,
                DateEnregistrement = o.DateEnregistrement,
                DateDebutDiffusion = o.DateDebutDiffusion,
                DateFinDiffusion = o.DateFinDiffusion,
                Document = o.Document,
                EmetteurLibelle = e.RaisonSociale,
                NatureOperationLibelle = n.LibNature
            };
     
     
    //Nombre d'élément à afficher par page
    int NbreParPage = 10;
     
    if (pg < 1)
        pg = 1; // Numéro de la page en cours
     
    //Comptage du nombre d'avis
    int totalItems = filtreOperations.Count();
     
    var pagination = new Pagination(totalItems, pg, NbreParPage);
     
    int incrementPage = (pg - 1) * NbreParPage;
     
    var Data = filtreOperations.Skip(incrementPage).Take(pagination.NbreParPage).ToList();
    this.ViewBag.Pagination = pagination;
     
    return View(Data);

    Citation Envoyé par fred1599 Voir le message
    Hello,



    Oui, parce-que les problèmes sont multiples...

    et que ça devient compliqué quand le projet grossi, les corrections apportées vont impactés tous les fichiers de votre projet.

    De notre côté on peut pas faire grand chose... il faut découper vos tâches, tester séparément et une fois tout cela bien vérifié, faire les interactions nécessaires entre chacun de vos fichiers.

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 400
    Par défaut
    ça m'a l'air bien...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2013
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2013
    Messages : 254
    Par défaut
    OK, merci pour ton aide.
    Citation Envoyé par fred1599 Voir le message
    ça m'a l'air bien...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JNI] Compatibilité de types
    Par rabobsky dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 11/07/2005, 13h01
  2. [MFC] SendMessage entre 2 contrôles
    Par Manson dans le forum MFC
    Réponses: 6
    Dernier message: 13/06/2005, 10h33
  3. Probème de type entre access et delphi
    Par samlerouge dans le forum Bases de données
    Réponses: 5
    Dernier message: 23/05/2004, 20h56
  4. Réponses: 4
    Dernier message: 23/05/2004, 18h14
  5. compatibilité ou différences entre USB 1.1 et USB2.0
    Par petitours dans le forum Composants
    Réponses: 7
    Dernier message: 06/12/2003, 10h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo