【问题标题】:MVC4 Ajax load records on windows scrollWindows 滚动上的 MVC4 Ajax 加载记录
【发布时间】:2014-10-14 19:17:12
【问题描述】:

使用 MVC4 和 Ajax。我正在加载 5 条记录并在 Windows 上向下滚动加载接下来的 5 条记录..etc

控制器:(工作)

    public JsonResult FetchData(int pageIndex = 0)
    {
      var model = ...
      ViewBag.count = pageIndex*2;

      return Json(model, JsonRequestBehavior.AllowGet);
    }          

查看

javascript:

$(function () {
    $(window).scroll(function () {
        if ($(window).scrollTop() == $(document).height() - $(window).height()) {
            FetchDataFromServer();
        }
    });
});

  function FetchDataFromServer() {
    var Id = $(".postcount").attr("Id");
    $.ajax({
        url: '@Url.Action("FetchData")',
        data: { pageIndex: Id },
        datatype: 'application/json',
        success: function () {
            //?
        },
        error: function () {
            alert("error");
        }
  });


 <div id="result">
   @Html.Partial("_ResultList",Model)
</div>

模型第一次被传递到局部视图并且数据成功加载。向下滚动时,Action FeachData 被执行,我可以看到数据被成功检索。

我的问题是当 FeachData 方法传递模型时,如何将模型传递给 Partial View 并附加到现有记录?

部分视图不包括模型,并有一个 @foreach(模型中的变量项){..} 循环并显示数据。

谢谢

【问题讨论】:

    标签: jquery ajax asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    如果您的模型是一个集合,请使用.Take().Skip() 过滤您想要的记录并根据结果返回部分视图。

    控制器

    public ActionResult FetchData(int skipCount, int takeCount)
    {
      var model = db.MyObjects.OrderBy(x => x.SomeProperty).Skip(skipCount).Take(takeCount);
      if (model.Any())
      {
        return PartialView("_ResultList", model);
      }
      else
      {
        return null;
      }
    }
    

    脚本

    var skipCount = 5; // start at 6th record (assumes first 5 included in initial view)
    var takeCount = 5; // return new 5 records
    var hasMoreRecords = true;
    
    function FetchDataFromServer() {
      if (!hasMoreRecords) {
        return;
      }
      $.ajax({
        url: '@Url.Action("FetchData")',
        data: { skipCount : skipCount, takeCount: takeCount },
        datatype: 'html',
        success: function (data) {
          if (data === null) {
            hasMoreRecords = false; // signal no more records to display
          } else {
            $("#result").append(data);
            skipCount += takeCount; // update for next iteration
          }
        },
        error: function () {
          alert("error");
        }
      });
    }
    

    编辑:使用 JSON 的替代方法

    控制器

    public ActionResult FetchData(int skipCount, int takeCount)
    {
      var model = db.MyObjects.OrderBy(x => x.SomeProperty).Skip(skipCount).Take(takeCount);
      return Json( new { items = model, count = model.Count() }, JsonRequestBehavior.AllowGet);
    }
    

    脚本

    var skipCount = 5; // start at 6th record (assumes first 5 included in initial view)
    var takeCount = 5; // return new 5 records
    var hasMoreRecords = true;
    
    function FetchDataFromServer() {
      if (!hasMoreRecords) {
        return;
      }
      $.ajax({
        url: '@Url.Action("FetchData")',
        data: { skipCount : skipCount, takeCount: takeCount },
        datatype: 'json',
        success: function (data) {
          if (data.Count < 5) {
            hasMoreRecords = false; // signal no more records to display
          }
          $.each(data.items, function(index, item) {
            // assume each object contains ID and Name properties
            var container = $('<div></div>');
            var id = $('<div></div>').text($(this).ID);
            container.append(id);
            var name = $('<div></div>').text($(this).Name);
            container.append(name);
            $("#result").append(container);
          });
          skipCount += takeCount; // update for next iteration
        },
        error: function () {
          alert("error");
        }
      });
    }
    

    【讨论】:

    • 谢谢。您将如何检查是否没有更多记录可检索以仅显示一条消息而不调用服务器 ActionResult FetchData?
    • 如果您要返回包含数据的 JSON(而不是部分视图)并在客户端上构建 html,您可以添加一个附加属性来指示是否没有更多记录要显示(即,如果查询返回的记录少于 5 条)。如果返回部分视图,我不确定最好的方法 - 也许如果查询返回零记录,则返回 null 而不是视图,以便您可以检查返回的值是否为 null,然后设置一个标志以便 ajax不会再次调用
    • 谢谢,所以如果我将返回更改为 JSON,即返回 Json(model, JsonRequestBehavior.AllowGet);如何将模型对象传递给局部视图或主视图并提取数据?
    • 我会尽快更新我的答案。我只是假设你的模型有 2 个属性 IDName 然后你在 &lt;div&gt; 标签中渲染。
    • @Roman,更新了答案以显示使用 JSON 结果的可能解决方案。注意还更新了原始内容,以显示如何使用局部视图测试是否还有更多项目。
    【解决方案2】:

    而不是 Json 从操作返回部分视图:

    public ActionResult FetchData(int pageIndex = 0)
        {
          var model = ...
          ViewBag.count = pageIndex*2;
    
          return View("_ResultList",model);
        }  
    

    在 Success 回调中,您将获得响应 html,您需要使用 append() 将其附加到该 div:

    success: function (response) {
                $("#result").append(response);
            }
    

    你也可以看到this post. Infinite Scroll Paging in Asp.net mvc 4

    【讨论】:

    • 我需要将模型传递给局部视图,在我的局部视图中,我有一个显示数据的 @foreach(模型中的变量项){}。我该怎么做?
    • @Roman 查看已编辑的帖子并参考帖子中的链接。它会帮助你
    • 我检查了链接,抱歉我仍然对如何追加感到困惑,响应是一个模型对象(包含所有记录)我如何将模型传递给部分视图?
    • 您必须从 ajax 调用的操作中返回部分视图,而不是模型,仅部分视图呈现为 html,并将附加在 div 中
    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多