在 Razor 视图中使用 Ajax 进行 Asp.Net Core 表分页

Posted

技术标签:

【中文标题】在 Razor 视图中使用 Ajax 进行 Asp.Net Core 表分页【英文标题】:Asp.Net Core Table Paging With Ajax in Razor View 【发布时间】:2019-05-22 22:21:55 【问题描述】:

我在 asp.net core razor 页面中有一个带有分页的 html5 表格。但通过单击下一页或上一页刷新整个页面。我想使用ajax在表格中实现分页。 我如何实现ajax分页???

  @foreach (var user in Model.UserManageViewModel.User)
            

                <tr>                        
                    <td>@string.Format("0 1", user.Name, user.LastName)</td>
                    <td>@user.NationalCode</td>
                    <td>@user.Mobile</td>
                    <td>@user.Email</td>
                    <td>@user.RegisterDate.ToShamsi()</td>
                    <td class="@((@user.IsActive)?"text-success":"text-danger")">@((user.IsActive) ? "فعال" : "غیرفعال")</td>
                    <td>@user.UserRoles</td>
                </tr>
            

  <a href="/Admin/users?pageId=@Model.UserManageViewModel.CurrentPage + 1)>next</a>

我的代码是:

public class IndexModel : PageModel

    private IUserService _userService;

    public IndexModel(IUserService userService)
    
        _userService = userService;
    

    public TableViewModel<User> UserManageViewModel  get; set; 

    public async Task OnGetAsync(int pageId=1,int maxRows=10)
    
            UserManageViewModel =await _userService.GetUserList(pageId, maxRows);
    


【问题讨论】:

您可以使用异步局部视图并在局部视图中显示您的表格。所以,只有那部分会在回发时刷新 但是使用标签进行分页没有刷新所有页面??? 【参考方案1】:

您可以使用 jquery 并像这样实现它:

<div id="users">
    @foreach (var user in Model.UserManageViewModel.User)
    ...
</div>

<a href="#">next</a>

$().ready(function()
   $("a").click(function()
      $.ajax(
         type: "POST",
         url: '@Url.Action("Users", "Admin",pageId=@Model.UserManageViewModel.CurrentPage + 1)',
         contentType: "application/json",
         dataType: "html",
         success: function (response) 
            $('#users').html(response);
         ,
         failure: function (response) 
            alert(response.responseText);
         ,
         error: function (response) 
           alert(response.responseText);
         
      );
   );
)

【讨论】:

我不能使用这个,因为我有一个包含用户列表和 pagenum 的类,......并且 json 不会发送所有这些。【参考方案2】:

您可以创建一个以 json 格式返回数据的 api,然后使用 javascript 动态创建表。

像这样创建一个控制器:

[Route("[controller]/[action]")]
public class ApiController : Controller

    private readonly IUserService _userService;

    public ApiController(IUserService userService)
    
        _userService = userService;
    

    [HttpGet]
    public async Task<JsonResult> GetUsers(int pageId = 1, int maxRows = 10)
    
        var tableVm = await _userService.GetUserList(pageId, maxRows); //TableViewModel<User>

        return Json(tableVm);
    

然后在按下下一个或上一个按钮时在您的脚本中:

$.getJSON("/api/getstudents", 
    pageId: currentPage + 1, //the pageId you want to retrieve
    maxRows: 10              //how many rows you want to retrieve
).done(function(data) 
    console.log(data);
    //data.currentPage has the new page index
    //data.user is an array of 10 Users

    currentPage = data.currentPage;

    //create the table however you like
    $.each(data.user, function(key, value) 
        $("table").append("<tr><td>" + value.lastName + "</td></tr>");
    );
);

您可以创建一个名为 _Users.cshtml 的局部视图:

@model TableViewModel<User>

<table class="table table-striped">
    @foreach(var user in Model.User)
    
        <tr>                        
            <td>@string.Format("0 1", user.Name, user.LastName)</td>
            <td>@user.NationalCode</td>
            <td>@user.Mobile</td>
            <td>@user.Email</td>
            <td>@user.RegisterDate.ToShamsi()</td>
            <td class="@((@user.IsActive)?"text-success":"text-danger")">@((user.IsActive) ? "فعال" : "غیرفعال")</td>
            <td>@user.UserRoles</td>
        </tr>
    
</table>

然后向您的 IndexModel 添加一个新的处理程序:

public async Task<PartialViewResult> OnGetUsersPartial(int pageId = 1, int maxRows = 10)

    var tableVm = await _userService.GetUserList(pageId, maxRows);

    return new PartialViewResult
    
        ViewName = "_Users",
        ViewData = new ViewDataDictionary<List<User>>(ViewData, tableVm)
    ;

您的 OnGetAsync() 中不需要任何内容​​,也不再需要 UserManageViewModel 属性。

最后在您的索引视图中添加:

<table id="table"></table>
<a id="next">Next</a>

@section Scripts

    <script>
        $(function() 
            var pageId = 1;

            var loadTable = function(pageId) 
                $('#table').load('/Index?handler=UsersPartial&pageId=' + pageId + '&maxRows=10');
            

            loadTable(pageId);

            $('#next').on('click', function() 
                loadTable(pageId++);
            );
        );
    </script>

【讨论】:

以上是关于在 Razor 视图中使用 Ajax 进行 Asp.Net Core 表分页的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net MVC Ajax.BeginForm OnComplete在Razor视图中传递c#参数

示例 AJAX 回调到 ASP.NET Core Razor 页面

我无法在 C# 中使用 Jquery 和 Ajax 从控制器向 Razor 视图发送值

ASP.Net Core 2 Razor AJAX GET带参数?

MVC-3 ASP.NET 共享视图-重定向-Razor

PartialViewResult 表单不会清除 ajax 结果上的值 - ASP.NET Core Razor c#