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
相关产品推荐
相关产品推荐

