Asp .Net Core 2.2 Razor Pages Ajax Call Post 不工作
Posted
技术标签:
【中文标题】Asp .Net Core 2.2 Razor Pages Ajax Call Post 不工作【英文标题】:Asp .Net Core 2.2 Razor Pages Ajax Call Post not working 【发布时间】:2019-10-12 13:18:09 【问题描述】:我在 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 组合,但都没有奏效。我看不出这里有什么问题......
编辑
问题似乎是在剃须刀页面上没有验证防伪令牌。
我在页面模型上写了 Ignore Anti forgery Token,一切正常
【问题讨论】:
这里的“不起作用”到底是什么意思?如果你调试发生了什么? 它没有到达页面处理程序,只是在浏览器上的开发工具上给出错误 400 Example AJAX call back to an ASP.NET Core Razor Page的可能重复 【参考方案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");
【讨论】:
没关系,我有 2 个 ajax 函数,我调用了错误的函数,因此它为什么不起作用!!它立即起作用。终于可以在 razor 页面上使用 Ajax,非常感谢! 这让我头疼了好久。它是否正式记录在任何地方? 是的@James,虽然它有点隐藏。 docs.microsoft.com/en-us/aspnet/core/security/…【参考方案2】:我不知道你映射的 URL 使用什么,但像往常一样它由 controllerName/actionName/ 组成。在你的情况下尝试使用:
url: "/Account/OnPostDeleteAsync"
或
url: "/Users/OnPostDeleteAsync"
但如果您的网址正确,请尝试使用 [FromForm] 属性
public async Task<IActionResult> OnPostDeleteAsync([FromForm]int? id)
我希望这会有所帮助
【讨论】:
好的,我发现了问题,是防伪令牌,我在我的页面模型上写了[IgnoreAntiforgeryToken(Order = 1001)],最后我点击了页面方法。我仍然不知道如何处理剃须刀页面中的令牌,我一直在使用控制器 问题不在于 url,这是由于 razor 页面上没有验证防伪令牌以上是关于Asp .Net Core 2.2 Razor Pages Ajax Call Post 不工作的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core 2.2 Razor 页面中的自定义路由
Asp .Net Core 2.2 Razor Pages Ajax Call Post 不工作
IIS 部署不能包含 asp.net core 2.2 razor 页面中 wwwroot 文件夹的文件
在 Razor (chtml) 中渲染动态视图,如何在 asp.net core 3.0 中将 FileProvider 添加到 razor?