Viewcomponent внутри циклов итерации foreach сохраняет те же данные - PullRequest
0 голосов
/ 12 января 2019

Я делаю веб-страницу внутри сетевого приложения MVC, где пользователь добавляет мебель в свою комнату. На странице используется цикл foreach для создания таблеток navtrap, которые содержат внутри видовые компоненты. Компоненты представления фильтруются по типу мебели (перечисление внутри модели мебели), чтобы получить простой список мебели указанного типа

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

// код видового компонента

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

Viewcomponent возвращает результат, но он всегда возвращает один и тот же результат. Из всех типов мебели ("диван", "кровать", "стол" ...) он возвращает только кровати в каждой пилюле. Я даже пытался жестко закодировать другой тип, но только продолжает возвращать кровати. Внутри отладчика цикл foreach выполняет правильные итерации, а внутри страницы бритвы Viewcoponent получает правильное значение перечисления, но функция invokeAsync по-прежнему остается на «кровати».

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Вот обработанный образец, обратите внимание, что href из <a></a> соответствует id из <div></div>

Furniture.cs

 public class Furniture
{
    public int Id { get; set; }
    public string FurName { get; set; }
    public FurnitureType FurnitureType { get; set; }
}

public enum FurnitureType
{
    bed,
    couch,
    table
}

Код основного вида

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

RoomFurnitureViewComponent.cs

 public IViewComponentResult Invoke(FurnitureType furnitureType, bool free)
    {
        List<Furniture> furniture = _context.Furniture.Where(x => x.FurnitureType == furnitureType).ToList();
        return View(furniture);
    }

default.cshtml viewcomponent

@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>
0 голосов
/ 07 июня 2019

Я нашел решение этой проблемы. Вы можете заставить его работать, делая копию значения во время каждой итерации:

@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 голосов
/ 12 января 2019

Ваш результат перечисления не отображается на Furniture.FurnitureType правильно, поэтому он всегда возвращает первое значение перечисления.

...