我在剃须刀页面上做了很多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组合,但是没有用。我看不到这里有什么问题。...
编辑
问题似乎出在剃须刀页面上未验证防伪令牌。
我在页面模型上写了“忽略防伪令牌”,一切正常
答案 0 :(得分:1)
我不知道您使用的URL映射是什么,但通常它由controllerName / actionName /组成。在您的情况下,请尝试使用:
url: "/Account/OnPostDeleteAsync"
或
url: "/Users/OnPostDeleteAsync"
但是如果您的网址正确,则尝试使用[FromForm]属性
public async Task<IActionResult> OnPostDeleteAsync([FromForm]int? id)
我希望这会有所帮助
答案 1 :(得分:1)
您已经发现,这是防伪令牌,这毁了您的一天。
现在,如果您在表单内,asp.net核心将为您创建带有该令牌的隐藏输入。如果您不使用页面上的表单,则必须调用@Html.AntiForgeryToken()
,它将为您添加令牌。
尽管如此,这仍无法解决您的错误请求。您必须将其添加到您的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");