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&lt;IActionResult&gt; OnPostDeleteAsync([FromForm]int? id)

我希望这会有所帮助

【讨论】:

好的,我发现了问题,是防伪令牌,我在我的页面模型上写了[IgnoreAntiforgeryToken(Order = 1001)],最后我点击了页面方法。我仍然不知道如何处理剃须刀页面中的令牌,我一直在使用控制器 问题不在于 url,这是由于 razor 页面上没有验证防伪令牌

以上是关于Asp .Net Core 2.2 Razor Pages Ajax Call Post 不工作的主要内容,如果未能解决你的问题,请参考以下文章