【问题标题】:Viewcomponent inside foreach iteration loops keeps returns the same dataforeach 迭代循环中的 Viewcomponent 不断返回相同的数据
【发布时间】:2019-01-12 12:45:35
【问题描述】:

我正在 MVC 网络核心应用程序中创建一个网页,用户可以在其中向他们的房间添加家具。该页面使用 foreach 循环来制作包含视图组件的引导导航药丸。视图组件按家具类型(Furniture 模型中的枚举)过滤,以返回该指定类型的家具的简单列表

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

视图组件返回结果,但它总是返回相同的结果。在所有家具类型(“沙发”、“床”、“桌子”...)中,它只返回每个导航药丸中的床。我什至尝试硬编码一种不同的类型,但只返回床位。在调试器内部,foreach 循环正确迭代,在 razor 页面内部,Viewcoponent 获得正确的枚举值,但 invokeAsync 函数仍保持设置在“床”上。

【问题讨论】:

    标签: c# model-view-controller asp.net-core asp.net-core-viewcomponent


    【解决方案1】:

    你的枚举结果没有正确映射到Furniture.FurnitureType,这就是为什么它总是返回第一个枚举值。

    【讨论】:

    • 请问具体在哪里?
    【解决方案2】:

    这是工作示例,注意保持&lt;a&gt;&lt;/a&gt;href&lt;div&gt;&lt;/div&gt;id 一致

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

    viewcomponent的default.cshtml

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

    【讨论】:

    • 不起作用。 1. 我不能直接在 foreach 中使用 FurType,我使用“@using ISZR.Web.Models”来访问模型(它不是通过控制器发送的),因此需要 obj.FurnitureType . 2.Sedcond 从枚举中删除所有“(Namjestaj.FurnitureType [])”只会将枚举值从文本更改为数字。我的代码在创建药丸时可以正常工作。我还使用“@Html.Action 来查看路由值是否设置正确,它们是正确的。Url.Action 生成”Area/Controller/Function/id=1 ,type="沙发",free=true
    【解决方案3】:

    我找到了解决此问题的方法。您可以通过在每次迭代期间复制该值来使其工作:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-22
      • 2014-05-29
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多