0
votes

Viewcomponent à l'intérieur des boucles d'itération foreach conserve les mêmes données

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


0 commentaires

3 Réponses :


0
votes

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.


1 commentaires

Où exactement, pouvez-vous préciser?



0
votes

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
}


1 commentaires

Ç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



0
votes

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


0 commentaires