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