无限滚动-ASP.NET Core MVC

时间:2019-04-07 15:35:37

标签: asp.net-mvc asp.net-core infinite-scroll

我们正在尝试在ASP.NET Core MVC应用程序中的数据网格中实现无限滚动。搜索了很多,但是找不到一个好的解决方案。有没有人在ASP.NET Core MVC的数据网格中使用无限滚动。如果可以的话,您可以提供任何指导

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。这是我的解决方案。它几乎适用于任何表:

InfinityScroll.js

function InfinitiySroll(iTable, iAction, iParams) {
    this.table = iTable;        // Reference to the table where data should be added
    this.action = iAction;      // Name of the conrtoller action
    this.params = iParams;      // Additional parameters to pass to the controller
    this.loading = false;       // true if asynchronous loading is in process
    this.AddTableLines = function (firstItem) {
        this.loading = true;
        this.params.firstItem = firstItem;
        // $("#footer").css("display", "block"); // show loading info
        $.ajax({
            type: 'POST',
            url: self.action,
            data: self.params,
            dataType: "html"
        })
            .done(function (result) {
                if (result) {
                    $("#" + self.table).append(result);
                    self.loading = false;
                }
            })
            .fail(function (xhr, ajaxOptions, thrownError) {
                console.log("Error in AddTableLines:", thrownError);
            })
            .always(function () {
                // $("#footer").css("display", "none"); // hide loading info
            });
    }

    var self = this;
    window.onscroll = function (ev) {
        if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
            //User is currently at the bottom of the page
            if (!self.loading) {
                var itemCount = $('#' + self.table + ' tr').length - 1;
                self.AddTableLines(itemCount);
            }
        }
    };
    this.AddTableLines(0);
}

在Visual Studio脚手架视图中-有一些修改

TestData.cshtml

@model IEnumerable<Infinity_Scroll.Models.TestData>

@{
    ViewData["Title"] = "TestData";
}

<h1>TestData</h1>

<table id="anyTable" class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Id)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Field1)
            </th>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>

@section Scripts {
    <script src="~/js/InfinitiySroll.js"></script>

    <script>
        var infinityScroll = new InfinitiySroll("anyTable", "/home/_TestData", { sortOrder: "ascending", searchString: "3" });
    </script>
}

表行的生成移至PartialView:

_TestData.cshtml

@model IEnumerable<Infinity_Scroll.Models.TestData>

@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Id)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Field1)
            </td>
        </tr>
}

这是控制器部分:

...
private const int BATCH_SIZE = 50;
public IActionResult TestData()
{
    return View();
}

[HttpPost]
public IActionResult _TestData(string sortOrder, string searchString, int firstItem = 0)
{
    List<TestData> testData = new List<TestData>();
    // Generate test data
    for (int i = 1; i < 500; i++)
    {
        testData.Add(new TestData() { Id = i, Field1 = "This is row " + i.ToString() });
    }

    // Sort and filter test data
    IEnumerable<TestData> query;
    if (sortOrder.ToLower() == "descending")
    {
        query = testData.OrderByDescending(m => m.Field1);
    }
    else
    {
        query = testData.OrderBy(m => m.Field1);
    }
    if (!String.IsNullOrEmpty(searchString)) query = query.Where(m => m.Field1.Contains(searchString));

    // Extract a portion of data
    var model = query.Skip(firstItem).Take(BATCH_SIZE).ToList();
    if (model.Count() == 0) return StatusCode(204);  // 204 := "No Content"
    return PartialView(model);
}

模型:

TestData.cs

namespace Infinity_Scroll.Models
{
    public class TestData
    {
        public int Id { get; set; }

        public string Field1 { get; set; }
    }
}

您可以在此处下载一个简单的Visual Studio示例:https://github.com/ThomasBrockmann/InfinityScroll