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

ASP.NET Core 6 MVC:如何通过Header传递防伪令牌给X.PagedList分页接口?

解决ASP.NET Core 6 MVC中X.PagedList分页传递防伪令牌的问题

核心思路

默认X.PagedListPager生成的是GET请求的跳转链接,无法直接携带请求头。要满足[ValidateAntiForgeryToken]的验证要求,需要将分页请求改为AJAX POST请求,通过请求头传递防伪令牌。


步骤1:修改分页视图代码

给分页链接添加自定义class,方便后续绑定AJAX事件,同时确保页面存在防伪令牌隐藏字段:

<!-- 确保页面包含防伪令牌(可放在表单内或页面顶部) -->
@Html.AntiForgeryToken()

<!-- 配置X.PagedListPager生成带自定义class的分页链接 -->
@Html.PagedListPager((IPagedList)Model.SearchResultViewPaging, page => 
        Url.Action("ResultPaging", "Participant", new { page = page }),
        new PagedListRenderOptions {
            LinkToFirstPageFormat = "首页",
            LinkToPreviousPageFormat = "上一页",
            LinkToNextPageFormat = "下一页",
            LinkToLastPageFormat = "末页",
            ItemLiElementClasses = new List<string> { "page-item" },
            PageClasses = new List<string> { "page-link-ajax" } // 自定义class用于绑定事件
        })

<!-- 用于渲染分页结果的容器 -->
<div id="search-results-container">
    <!-- 这里放你的搜索结果列表 -->
</div>

步骤2:编写AJAX请求逻辑

通过JavaScript阻止分页链接的默认跳转,发起POST请求并携带防伪令牌头:

$(document).on('click', '.page-link-ajax', function(e) {
    e.preventDefault(); // 阻止默认的GET跳转

    const targetUrl = $(this).attr('href');
    const verificationToken = $('input:hidden[name="__RequestVerificationToken"]').val();

    $.ajax({
        url: targetUrl,
        type: 'POST',
        headers: {
            'RequestVerificationToken': verificationToken // 携带防伪令牌
        },
        success: function(response) {
            // 用返回的部分视图更新结果容器
            $('#search-results-container').html(response);
        },
        error: function(xhr) {
            console.error('分页请求失败:', xhr);
        }
    });
});

步骤3:调整控制器方法

将分页接口改为HttpPost,并根据AJAX请求返回部分视图:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult ResultPaging(int page)
{
    // 1. 获取分页数据(根据你的业务逻辑实现)
    int pageSize = 10; // 每页条数
    var pagedData = _participantService.GetPagedResults(page, pageSize);
    
    // 2. 构造视图模型
    var viewModel = new YourViewModel
    {
        SearchResultViewPaging = pagedData
    };

    // 3. 针对AJAX请求返回部分视图,非AJAX返回完整视图
    if (Request.Headers["X-Requested-With"] == "XMLHttpRequest")
    {
        return PartialView("_SearchResultsPartial", viewModel); // 替换为你的结果部分视图名称
    }

    return View("Result", viewModel);
}

内容的提问来源于stack exchange,提问作者Diego

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:41:05