You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用LINQ分组统计并在MVC Razor页面通过ViewData展示工单计数

解决LINQ分组统计存入ViewData及Razor页面展示问题

看起来你遇到的核心问题是LINQ分组结果无法正确存入ViewData导致页面变量为空,而ViewBag功能正常,这大概率是方法逻辑、数据类型处理或者ViewData赋值环节出了问题。咱们一步步拆解解决:

1. 修正LINQ分组统计方法

你提供的CountofType方法是void类型,这意味着它既没有返回统计结果,也没在方法内部完成ViewData赋值(就算是Controller类里的方法,这种写法也不利于逻辑拆分)。先重构这个方法,让它返回正确的统计集合,同时修正LINQ查询的写法:

第一步:创建ViewModel(规避匿名类型的麻烦)

匿名类型在Razor视图里强转非常不方便,建议先定义一个专门的视图模型类:

public class TicketCountViewModel
{
    public string TicketType { get; set; }
    public int Count { get; set; }
}

第二步:重构CountofType方法

把方法改成返回List<TicketCountViewModel>,确保LINQ查询正确获取分组的类型和数量:

public List<TicketCountViewModel> CountofType(IQueryable<Tickets> _Tickets)
{
    var countType = _Tickets
        .GroupBy(t => t.Type) // 直接按Type分组,无需匿名类包裹(除非Type是复杂类型)
        .Select(group => new TicketCountViewModel
        {
            TicketType = group.Key, // 如果Type是枚举,可转成字符串:group.Key.ToString()
            Count = group.Count()
        })
        .ToList(); // 立即执行查询,将结果转为List

    return countType;
}

2. 在Controller中正确赋值ViewData

在你的Controller动作方法里,调用上面的统计方法,把结果存入ViewData:

public IActionResult Index()
{
    // 假设你已获取Tickets的IQueryable数据源
    var ticketsQuery = _dbContext.Tickets.AsQueryable();
    
    // 调用统计方法并存入ViewData
    ViewData["TicketTypeCounts"] = CountofType(ticketsQuery);

    // 你的其他ViewBag逻辑(下拉框等)保持不变
    ViewBag.Categories = new SelectList(...);

    return View();
}

3. 在Razor页面中渲染Bootstrap卡片

在View里,先把ViewData强转成对应的ViewModel集合,再循环生成卡片:

<div class="row">
    @{
        // 强转ViewData为指定类型,空值时赋空集合避免报错
        var ticketCounts = ViewData["TicketTypeCounts"] as List<TicketCountViewModel> ?? new List<TicketCountViewModel>();
    }

    @foreach (var item in ticketCounts)
    {
        <div class="col-md-4 mb-3">
            <div class="card text-center">
                <div class="card-header">@item.TicketType</div>
                <div class="card-body">
                    <h5 class="card-title">@item.Count</h5>
                    <p class="card-text">当前状态工单数量</p>
                </div>
            </div>
        </div>
    }
</div>

常见问题排查

如果还是显示为空,检查以下几点:

  • 确认_Tickets数据源确实有数据,可以在Controller里打断点,查看CountofType返回的集合是否包含元素。
  • 如果Type是枚举类型,确保转成字符串显示(比如group.Key.ToString()或者Enum.GetName(typeof(TicketType), group.Key))。
  • 检查ViewData的键名是否和视图里的一致(比如Controller里是"TicketTypeCounts",视图里也要对应)。
  • 尽量避免在工具方法里直接操作ViewData,最好返回结果后由Controller统一赋值,逻辑更清晰。

这样调整后,应该就能正常把分组统计的工单数量通过ViewData传递到页面,渲染出对应的Bootstrap卡片了。

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:19:43