如何用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
相关产品推荐
相关产品推荐

