Je crée une page Web dans une application MVC net core où un utilisateur ajoute des meubles à sa pièce. La page utilise une boucle foreach pour créer des pilules de navigation bootstrap contenant des composants de vue. Les composants de la vue sont filtrés par type de mobilier (énumération à l'intérieur du modèle de mobilier) pour renvoyer une simple liste de meubles de ce type spécifié
public IViewComponentResult Invoke(int id, Furniture.FurnitureType typ, bool free) { List<Furniture> furniture= db.Furniture.Where(x => x.FurnitureType == typ).ToList(); return View("RoomFurniture", furniture); }
// code du composant de la vue
<ul class="nav nav-pills"> @foreach (Furniture.FurnitureType FurType in (Namjestaj.FurnitureType [])Enum.GetValues(typeof(Furniture.FurnitureType ))) { <li><a data-toggle="pill" href="#@(FurType )">@(FurType )</a></li> } </ul> @foreach (Furniture.FurnitureType FurType in (Namjestaj.FurnitureType [])Enum.GetValues(typeof(Furniture.FurnitureType ))) { <div id="@(FurnitureType )" class="tab-pane fade"> <p>@(FurnitureType )</p> @await Component.InvokeAsync("RoomFurniture", new { id = Model.Id, FurnitureType= FurType , free= true }) </div> }
Le composant de la vue renvoie le résultat mais il renvoie toujours le même résultat. De tous les types de meubles ("canapé", "lit", "table" ...) il ne renvoie que les lits dans chaque pilule de navigation. J'ai même essayé de coder en dur un type différent, mais je ne fais que retourner les lits. À l'intérieur du débogueur, la boucle foreach s'itère correctement et à l'intérieur de la page de rasoir, Viewcoponent obtient la bonne valeur d'énumération, mais la fonction invokeAsync reste toujours définie sur "bed".
3 Réponses :
Le résultat de votre énumération ne correspond pas correctement à Furniture.FurnitureType
, c'est pourquoi il renvoie toujours la première valeur d'énumération.
Où exactement, pouvez-vous préciser?
Voici l'exemple travaillé, notez que le href
de
est cohérent avec le id
de
Furniture.cs
@model List<MVC2_1Test.Models.Furniture> @{ ViewData["Title"] = "Default"; } <table class="table"> <thead> <tr> <th> FurName </th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.FurName) </td> </tr> } </tbody> </table>
Code de la vue principale
public IViewComponentResult Invoke(FurnitureType furnitureType, bool free) { List<Furniture> furniture = _context.Furniture.Where(x => x.FurnitureType == furnitureType).ToList(); return View(furniture); }
RoomFurnitureViewComponent.cs
<ul class="nav nav-pills"> @foreach (FurnitureType FurType in Enum.GetValues(typeof(FurnitureType))) { <li><a data-toggle="pill" href="#@(FurType )">@(FurType )</a></li> } </ul> @foreach (FurnitureType FurType in Enum.GetValues(typeof(FurnitureType))) { <div id="@(FurType )" class="tab-pane fade"> <p>@(FurType)</p> @await Component.InvokeAsync("RoomFurniture", new {furnitureType = FurType, free = true }) </div> }
Le default.cshtml de viewcomponent
public class Furniture { public int Id { get; set; } public string FurName { get; set; } public FurnitureType FurnitureType { get; set; } } public enum FurnitureType { bed, couch, table }
Ça ne marche pas. 1. Je ne peux pas simplement utiliser le FurType directement dans le foreach, j'utilise le "@using ISZR.Web.Models" pour pouvoir accéder au modèle (il n'est pas envoyé via le contrôleur) donc obj.FurnitureType est nécessaire . 2.Sedcond off tout en supprimant le "(Namjestaj.FurnitureType [])" des énumérations ne modifie que les valeurs d'énumération du texte en nombres. Mon code fonctionne correctement en ce qui concerne la création de la pilule. J'utilise également le "@ Html.Action pour voir si les valeurs d'itinéraire sont correctement définies, lesquelles sont-elles. Url.Action génère" Area / Controller / Function / id = 1 , type = "canapé", gratuit = vrai
J'ai trouvé une solution de contournement à ce problème. Vous pouvez le faire fonctionner en faisant une copie de la valeur à chaque itération:
@foreach (Furniture.FurnitureType FurType in (Namjestaj.FurnitureType [])Enum.GetValues(typeof(Furniture.FurnitureType ))) { var furType = FurType; <div id="@(FurnitureType )" class="tab-pane fade"> <p>@(FurnitureType )</p> @await Component.InvokeAsync("RoomFurniture", new { id = Model.Id, FurnitureType = furType, free= true }) </div> }