【问题标题】:Return list to Partial View using JSon使用 JSon 将列表返回到局部视图
【发布时间】:2021-12-27 04:05:37
【问题描述】:

我正在尝试获取类别列表,并与该列表一起显示与类别匹配的记录数或计数。我在控制器中有 Json。在我刚刚返回带有foreach 的类别列表之前。但现在想显示计数也。我创建了一个 SQL 视图并将类别与帖子联系起来,这就是我的 ViewModel 中的内容

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

然后在需要清理的Controller中,加上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);
}

而我的视图需要有这种样式,并转换为json字符串除外:

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

我的问题是如何在视图中显示列表以及如何将 UrlSlug 添加到字符串中。 UrlSlug 用于类别。

感谢您的帮助!

更新:按要求 - Sql 视图脚本

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

更新:当前脚本也可以按我的意愿工作。在下面的答案的帮助下。

视图模型

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

控制器 我必须添加 PostId,因为我的列表返回所有类别并计算它们,即使它们可能没有与之关联的帖子。 查看部分视图。 如果该类别没有帖子,我的 SqlView 返回 Null,因此我将其更正为显示 0 See Sql View

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

部分视图

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

SqlView

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

【问题讨论】:

    标签: c# jquery sql json asp.net-mvc


    【解决方案1】:

    根据帖子所有者提供的视图脚本更新。

    抱歉之前的回答。应该请求有关数据库表架构和脚本的更多详细信息。

    由于您的脚本是Category LEFT JOIN Post,因此查询结果可能会返回Post.Idnull。查看以下链接:

    Sample DB Fiddle


    数据库

    将在 DB 脚本中添加一个新列 PostId。此列将用于识别Category 是否包含任何Post

    SELECT a.Name AS CategoryName, b.Id AS PostId, b.Name AS PostName, b.UrlSlug
    FROM Category a
    LEFT OUTER JOIN Post b ON a.Id = b.CategoryId;
    

    型号

    您需要通过Category访问Posts

    先决条件:CategoryViewModel 类结构应如下所示:

    public class CategoryViewModel
    {
        public string Cat { get; set; }
        public int CountPosts { get; set; }
        public List<Post> Posts { get; set; }
    }
    

    控制器

    1. CountPosts 用于检查Category 是否有任何Post 如果PostId 不为空。 (更新)
    2. Posts 用于生成一组Posts,其中PostId 不为空。 (更新)
    3. 按降序排列CountPosts(更新)
    4. 看来您正在使用带有@model 绑定的Razor,那么您必须为控制器方法返回View(model)
    public ActionResult Category()
    {
        var model = (from c in db.PostsInCategories
                     group c by c.Name into g
                     select new CategoryViewModel
                     {
                         Cat = g.Key,
                         CountPosts = g.Where(x => x.PostId != null).Count(),
                         Posts = g.Where(x => x.PostId != null)
                             .Select(x => new Post
                             {
                                 Id = (int)x.PostId,
                                 Name = x.PostName,
                                 UrlSlug = x.UrlSlug
                             })
                             .ToList()
                     })
                    .OrderByDescending(x => x.CountPosts)
                    .ToList();
    
        return View(model);
    }
    

    查看

    视图已更改。每个Category 都有一个嵌套层PostsPosts 只会在item.CountPosts &gt; 0 时显示。

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

    输出

    【讨论】:

    • 感谢您的解决方案。所以它不喜欢 First() 说它只能在最后使用或类似的东西。所以我不得不使用 FirstOrDefault。它只生成包含帖子的类别。我正在寻找完整的类别列表,如果没有帖子,它只会产生 0。
    • 抱歉,这是我的错。我不得不在 SQL 视图中更改加入。谢谢
    • 一个小问题。我更改了视图中的加入,但如果没有与之关联的帖子并且它不喜欢它,现在 id 为空。
    • 介意分享您的视图脚本吗?谢谢。
    • 在更新下添加到顶部
    猜你喜欢
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多