Razor Pages中Ajax调用Handler返回400状态码问题求助
Razor Pages Ajax调用Handler出现400错误的解决方法
你遇到的错误:
Failed to load resource: the server responded with a status of 400 ()
问题根源及修正方案
1. 请求方法与Handler不匹配
你的Ajax使用POST请求,但后端Handler方法是OnGetGetAliases——这是Razor Pages中对应GET请求的命名规则,方法名不匹配直接导致400错误。
2. XSRF验证头名称错误
如果使用POST请求,Razor Pages要求的验证头是RequestVerificationToken,而非你代码中的XSRF-TOKEN。
修正方案一:改用GET请求(匹配现有Handler)
修改main.js中的请求类型为GET,同时可以去掉XSRF验证相关代码(GET请求无需验证):
$.ajax({ type: "GET", url: "/Products/Edit?handler=GetAliases&id=1", success: function (response) { $('#product-aliases-container').html(response); }, failure: function (response) { alert('failure: ' + response.responseText); }, error: function (response) { alert('error: ' + response.responseText); } });
修正方案二:保留POST请求(修改后端Handler)
第一步:修改后端Handler方法名
将OnGetGetAliases改为OnPostGetAliases,对应POST请求:
public class EditModel : PageModel { private readonly MyProject.Models.MyDatabaseContext _context; public EditModel(MyProject.Models.MyDatabaseContext context) { _context = context; } ... public IEnumerable<ProductAlias> Aliases { get; set; } = default!; // 方法名改为OnPost开头 public PartialViewResult OnPostGetAliases(int? id) { var aliases = _context.ProductAliases.Where(m => m.ProductId == id); Aliases = aliases; return Partial("_AssetAliasList", Aliases); } }
第二步:修正Ajax的XSRF请求头
将请求头名称改为RequestVerificationToken:
$.ajax({ type: "POST", url: "/Products/Edit?handler=GetAliases", beforeSend: function (xhr) { // 修正请求头名称 xhr.setRequestHeader("RequestVerificationToken", $('input:hidden[name="__RequestVerificationToken"]').val()); }, data: { "id": 1 }, success: function (response) { $('#product-aliases-container').html(response); }, failure: function (response) { alert('failure: ' + response.responseText); }, error: function (response) { alert('error: ' + response.responseText); } });
额外注意
确保你的页面中存在__RequestVerificationToken隐藏字段,Razor Pages通常会自动生成该字段,只要页面包含<form>标签或调用了@Html.AntiForgeryToken()方法。
内容的提问来源于stack exchange,提问作者s15199d
相关产品推荐
相关产品推荐

