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

ASP.NET MVC中通过Json向分部视图返回列表并展示分类文章计数的实现

分类列表关联文章数量统计实现方案

需求为获取分类(Categories)列表,同时展示每个分类下匹配的文章记录数量。已在控制器中准备了Json数据,此前仅通过foreach返回分类列表,现在需要同时展示文章计数,已创建SQL View关联分类与文章(posts)表。


初始问题代码

初始ViewModel

public class PostsInCategories
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string UrlSlug { get; set; }
}

初始待优化控制器代码

需要补充UrlSlug字段到返回结果:

public ActionResult Category()
{
    //List<CategoryViewModel> Category = new List<CategoryViewModel>();
    //Category = db.Categories.Where(k => k.IsDelete != true).OrderByDescending(a => a.CreatedDate).ToList().Select(a => a.ToCategoryModel()).ToList();
    var model = (from c in db.PostsInCategories
                 group c by c.Name into g
                 orderby g.Count() descending
                 select new
                 {
                     Cat = g.Key,
                     CountPosts = g.Count()
                 }).ToList();

    //return PartialView(@"~/Views/Blog/Partials/Category.cshtml", Category);
    return Json(new { result = model }, JsonRequestBehavior.AllowGet);
}

初始视图代码

需要保留原有样式,同时改造为支持接收包含计数和UrlSlug的数据集:

@model  IEnumerable<MyProject.Models.CategoryViewModel>
<ul class="list list-border angle-double-right">
@foreach (var item in Model)
{
    <li>
        <a href="/Blog/Category/@item.UrlSlug/@item.Id">
            @Html.DisplayFor(modelItem => item.Name)
            <span>(19)</span>
        </a>
    </li>
}
</ul>

初始SQL View脚本

SELECT        dbo.Category.Name, dbo.Post.Id, dbo.Post.UrlSlug
FROM          dbo.Category LEFT OUTER JOIN
              dbo.Post ON dbo.Category.Id = dbo.Post.CategoryId

最终实现代码

1. 新建ViewModel

public class CategoryListViewModel
{
    public int Id { get; set; }
    public string Category { get; set; }
    public string UrlSlug { get; set; }
    public int CountPosts { get; set; }
    public int PostId { get; set; }
}

2. 优化后控制器代码

新增PostId字段,即使分类下没有关联文章也会返回该分类:

public ActionResult Category()
    {
        var model = (from c in db.PostsInCategories
                     group c by c.Name into g
                     orderby g.Count() descending
                     select new CategoryListViewModel
                     {
                         Category = g.Key,
                         Id = g.FirstOrDefault().Id,
                         UrlSlug = g.FirstOrDefault().UrlSlug,
                         PostId = g.FirstOrDefault().PostId,
                         CountPosts = g.Count()

                     }).ToList();

        return View(model);
    }

3. 优化后分部视图代码

保留原有样式,新增文章计数展示逻辑,无文章的分类计数显示为0:

<ul class="list list-border angle-double-right">
@foreach (var item in Model)
{
    <li>
        <a title="@item.Category Posts" href="/Blog/Category/@item.UrlSlug/@item.Id">
            @Html.DisplayFor(modelItem => item.Category)
        </a>
            <span title="Number of Posts">( @if (item.PostId != 0)
            {  @item.CountPosts }
            else
            { <text>0</text>} )</span>
    </li>
}
</ul>

4. 修正后SQL View代码

用ISNULL处理无文章分类的PostId字段,空值默认返回0:

SELECT  dbo.Category.Id, dbo.Category.Name, dbo.Category.UrlSlug, ISNULL(dbo.Post.Id, 0) AS PostId
FROM    dbo.Category LEFT OUTER JOIN
        dbo.Post ON dbo.Category.Id = dbo.Post.CategoryId

内容的提问来源于stack exchange,提问作者S.Purtan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:36:03