Asp .Net Core 2.2 Razor Pages Ajax 调用 Post 不工作
Asp .Net Core 2.2 Razor Pages Ajax Call Post not working
我在 razor 页面上做了很多 ajax,但我不明白为什么这不起作用。它一直给我开发工具上的错误 400。无论如何它都不会到达页面处理程序。
<script>
$.ajax({
url: "/Account/Users/Index?handler=Delete",
type: "POST",
data: {
id: id
},
success: function () {
swal("Utilizador Desactivado!", {
icon: "success",
});
},
error: function (xhr, ajaxOptions, thrownError) {
swal("Falha na ligação ao servidor. Tente novamente mais tarde.");
}
});
</script>
页面处理程序
public async Task<IActionResult> OnPostDeleteAsync(int? id)
{
if (id == null)
{
return NotFound();
}
var user = await _context.Users.FindAsync(id);
if (user != null)
{
user.IsActivo = false;
_context.Users.Attach(user).Property( u => u.IsActivo).IsModified = true;
await _context.SaveChangesAsync();
}
return RedirectToPage("./Index");
}
我尝试了很多 url 组合并且 none 有效。我看不出这里有什么问题....
编辑
问题似乎出在 razor 页面上的防伪标记未被验证。
我在页面模型上写了 Ignore Anti forgery Token,一切正常
我不知道你 URL 的映射使用什么,但像往常一样它由 controllerName/actionName/ 组成。在你的情况下尝试使用:
url: "/Account/OnPostDeleteAsync"
或
url: "/Users/OnPostDeleteAsync"
但是如果你的 URL 是正确的,那么尝试使用 [FromForm] 属性
public async Task<IActionResult> OnPostDeleteAsync([FromForm]int? id)
希望对您有所帮助
正如您已经发现的那样,它是防伪标记,这会毁了您的一天。
现在,如果您在一个表单中,asp.net 核心将为您创建一个带有该标记的隐藏输入。如果您没有在页面上使用表单,则必须调用 @Html.AntiForgeryToken()
,这将为您添加令牌。
不过,这不会为您解决 Bad Request。您必须将其添加到您的 ajax 调用中:
$.ajax({
url: "/Account/Users/Index?handler=Delete",
type: "POST",
beforeSend: function (xhr) {
xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val());
},
data: {
id: id
},
});
此外,将此行添加到您的 Startup.cs 文件中:
services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
我在 razor 页面上做了很多 ajax,但我不明白为什么这不起作用。它一直给我开发工具上的错误 400。无论如何它都不会到达页面处理程序。
<script>
$.ajax({
url: "/Account/Users/Index?handler=Delete",
type: "POST",
data: {
id: id
},
success: function () {
swal("Utilizador Desactivado!", {
icon: "success",
});
},
error: function (xhr, ajaxOptions, thrownError) {
swal("Falha na ligação ao servidor. Tente novamente mais tarde.");
}
});
</script>
页面处理程序
public async Task<IActionResult> OnPostDeleteAsync(int? id)
{
if (id == null)
{
return NotFound();
}
var user = await _context.Users.FindAsync(id);
if (user != null)
{
user.IsActivo = false;
_context.Users.Attach(user).Property( u => u.IsActivo).IsModified = true;
await _context.SaveChangesAsync();
}
return RedirectToPage("./Index");
}
我尝试了很多 url 组合并且 none 有效。我看不出这里有什么问题....
编辑
问题似乎出在 razor 页面上的防伪标记未被验证。
我在页面模型上写了 Ignore Anti forgery Token,一切正常
我不知道你 URL 的映射使用什么,但像往常一样它由 controllerName/actionName/ 组成。在你的情况下尝试使用:
url: "/Account/OnPostDeleteAsync"
或
url: "/Users/OnPostDeleteAsync"
但是如果你的 URL 是正确的,那么尝试使用 [FromForm] 属性
public async Task<IActionResult> OnPostDeleteAsync([FromForm]int? id)
希望对您有所帮助
正如您已经发现的那样,它是防伪标记,这会毁了您的一天。
现在,如果您在一个表单中,asp.net 核心将为您创建一个带有该标记的隐藏输入。如果您没有在页面上使用表单,则必须调用 @Html.AntiForgeryToken()
,这将为您添加令牌。
不过,这不会为您解决 Bad Request。您必须将其添加到您的 ajax 调用中:
$.ajax({
url: "/Account/Users/Index?handler=Delete",
type: "POST",
beforeSend: function (xhr) {
xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val());
},
data: {
id: id
},
});
此外,将此行添加到您的 Startup.cs 文件中:
services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");