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

如何正确统计Ajax请求返回的IEnumerable<UpcomingGigs>对象数量?

解决Ajax请求返回Gig数量统计问题

首先得明确一个关键问题:你的后端Action返回的是PartialView渲染后的HTML字符串,不是JSON格式的GigsViewModel对象。所以前端success回调里的data是一段HTML文本,不是JavaScript对象——这就是你用data.Length和Object.keys(data).length统计结果不准确的原因,前者统计的是HTML字符串的长度,后者根本不适用。

下面给你三种不同场景下的解决方案,你可以根据自己的需求选择:


方案1:后端返回包含统计数和HTML的JSON(最灵活)

这种方法需要修改后端Action,把PartialView的HTML和当前返回的Gig数量一起封装成JSON返回,前端直接读取统计数即可:

后端修改:

public ActionResult FetchGigs(int skip, int take) {
    // 先把查询结果ToList(),这样才能获取Count,同时避免后续重复查询数据库
    var upcomingGigs = _context.Gigs
        .Include(g => g.Artist)
        .Where(g => g.DateTime > DateTime.Now)
        .OrderBy(d => d.DateTime)
        .Skip(skip).Take(take)
        .ToList();
    
    var viewModel = new GigsViewModel { 
        UpcomingGigs = upcomingGigs,
        TotalGigs = upcomingGigs.Count // 赋值本次返回的Gig数量
    };
    
    // 辅助方法:把PartialView渲染成HTML字符串
    var htmlContent = RenderPartialViewToString("FetchGigs", viewModel);
    
    // 返回JSON对象,包含HTML和统计数
    return Json(new { 
        Html = htmlContent,
        ReturnedGigCount = viewModel.TotalGigs
    }, JsonRequestBehavior.AllowGet);
}

// 添加这个辅助方法到你的Controller里
private string RenderPartialViewToString(string viewName, object model) {
    ViewData.Model = model;
    using (var stringWriter = new StringWriter()) {
        var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, stringWriter);
        viewResult.View.Render(viewContext, stringWriter);
        viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
        return stringWriter.GetStringBuilder().ToString();
    }
}

前端修改:

$(window).scroll(function () {
    if ($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
        $.ajax({
            type: "GET",
            url: "@Url.Action("FetchGigs")",
            data: { skip: skip, take: take },
            dataType: "json", // 明确告诉jQuery我们要接收JSON
            success: function (response) {
                // 直接拿到准确的数量
                console.log("本次请求返回了 " + response.ReturnedGigCount + " 个Gig");
                // 把HTML插入页面
                $(".result").append(response.Html);
                // 更新skip参数,用于下一页加载
                skip += take;
            }
        })
    }
});

方案2:在PartialView中嵌入隐藏统计值(无需改返回类型)

如果不想改动后端返回的类型,依然返回HTML,可以在PartialView里加一个隐藏元素,存储本次返回的Gig数量:

PartialView(FetchGigs.cshtml)修改:

在视图的开头或结尾添加一个隐藏input:

<!-- 把本次返回的Gig数量存在隐藏元素里 -->
<input type="hidden" class="current-gig-count" value="@Model.UpcomingGigs.Count()" />

⚠️ 注意:后端必须把upcomingGigs转为List(ToList()),否则Count()会触发额外的数据库查询,建议在Action里加上ToList()(参考方案1的后端代码)。

前端修改:

$(window).scroll(function () {
    if ($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
        $.ajax({
            type: "GET",
            url: "@Url.Action("FetchGigs")",
            data: { skip: skip, take: take },
            success: function (data) {
                // 把HTML转为jQuery对象,提取隐藏值
                var $htmlFragment = $(data);
                var gigCount = parseInt($htmlFragment.find(".current-gig-count").val());
                console.log("本次返回Gig数量:" + gigCount);
                
                // 可选:移除隐藏元素,避免页面冗余
                $htmlFragment.find(".current-gig-count").remove();
                
                // 插入页面
                $(".result").append($htmlFragment);
                skip += take;
            }
        })
    }
});

方案3:直接统计HTML中的Gig条目(依赖DOM结构)

如果你的PartialView里每个Gig对应一个独立的DOM元素(比如每个Gig是一个带.gig-item类的div),可以直接统计这些元素的数量:

假设PartialView的Gig结构:

<div class="gig-item">@item.DateTime.ToString("MM/dd/yyyy HH:mm:ss") - @item.Artist.Name</div>

前端修改:

$(window).scroll(function () {
    if ($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
        $.ajax({
            type: "GET",
            url: "@Url.Action("FetchGigs")",
            data: { skip: skip, take: take },
            success: function (data) {
                var $htmlFragment = $(data);
                // 统计.gig-item元素的数量
                var gigCount = $htmlFragment.find(".gig-item").length;
                console.log("本次返回Gig数量:" + gigCount);
                
                $(".result").append($htmlFragment);
                skip += take;
            }
        })
    }
});

这种方法不需要后端做任何额外处理,但缺点是依赖HTML结构的稳定性——如果后续修改了Gig的DOM结构,统计逻辑也要跟着调整。


内容的提问来源于stack exchange,提问作者J.Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:27:53