【问题标题】:Dynamically return a variable number of models with ajax使用ajax动态返回可变数量的模型
【发布时间】:2018-05-09 18:40:58
【问题描述】:

我目前有如下所示的代码,我将数据从控制器传递到我的视图,然后显示数据。

使用 ajax 我想调整我的视图,使其对通过控制器传递的数据更加动态。

目标:

目前,视图会返回用户关注的人的姓名列表。我想要一个设置变量,例如maxShow = 5,页面加载时最多显示5个人。当用户滚动到页面底部时,ajax 将获取并放置下一个 5 到 dom 上,这应该是一个连续的循环。

我已经用 jquery 提出了一些粗略的伪代码,如下所示,用于动态加载每个人,但无法弄清楚如何将呼叫限制为 5 人,然后滚动时再限制 5 人,依此类推到最底层。我唯一的半解决方案是最后将我的以下查询更改为 .take(5) 。

$(window).scroll(function() {
   if($(window).scrollTop() + $(window).height() == $(document).height()) {
       // Make an Ajax call 
     $.get("/Following",function(data){
      $("#div").html(data);
      });
     }

        [Authorize]
        public ActionResult Following()
        {
            var userId = User.Identity.GetUserId();

            var following = _context.Followings
                            .Where(x => x.FollowerId == userId)
                            .Select(a => a.Followee)
                            .ToList();

            var viewModel = new FollowingViewModel
            {
                Following = following,
                ShowActions = User.Identity.IsAuthenticated,
                Heading = "People I'm following"
            };

            return View("following", viewModel);
        }

查看

@model Gighub3.ViewModels.FollowingViewModel

@{
    ViewBag.Title = "Following";
}

<h1>@Model.Heading</h1>

<ul>
    @foreach (var following in Model.Following)
    {
        <li>@following.Name</li>
    }
</ul>

【问题讨论】:

  • 您需要为每次调用 ajax 时递增的“计数器”设置一个全局 javascript 变量,并将其传递给控制器​​方法,以便您可以使用 .Skip().Take() in您的查询
  • 在特定情况下,对于某些外部/业务因素,您无法将参数传递给 Skip and Take 方法,您将如何处理? - 你怎么能找到更新 Skip 的方法? @StephenMuecke
  • 如果浏览器不向服务器发送值,那么服务器就无法知道您接下来想要什么记录集。目前尚不清楚为什么您不能将方法更改为public ActionResult Following(int page)
  • 忽略我问题中的代码,ActionResult 本身不执行查询,而是在 actionResult 中调用方法 getData() 并且 getData() 返回 Task 模型(我想要的数据),并且该模型被传递给 ActionResult。但是,我的 ajax 是针对 ActionResult 的,出于业务需求的原因,我无法在任务 getData() 中传递参数,并且由于查询是在 getData() 中完成的,因此无法考虑在 ActionResult 中使用参数。对不起,如果这真的解释得不好@StephenMuecke
  • 你将一个值传递给你的 ActionResult 方法(比如 int page 参数),然后使用 var data = getData().Skip(page * x).Take(x); 过滤结果,其中 x 是你想要的记录数(尽管它效率不高,因为您的 getData() 方法每次都返回所有记录,而不是查询数据库并仅返回您想要的 x 记录

标签: javascript jquery .net asp.net-mvc


【解决方案1】:

听起来你需要实现某种分页_context.Followings 需要对其进行排序,然后添加limit(一次要获取的结果数,例如5)和start(您当前在哪个页面,即该人有多少次向下滚动以触发对更多关注者的请求)参数到您的 ajax 请求。然后您可以执行以下操作:

_context.Followings.OrderBy(*/something in here*/).Skip((start - 1) * limit).Take(limit)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 2022-10-05
    • 2021-11-24
    • 2022-07-29
    • 2017-04-28
    • 2016-05-23
    • 1970-01-01
    • 2020-01-23
    相关资源
    最近更新 更多