使用 AJAX 进行 GET 的 Razor Pages PageModel 绑定

Posted

技术标签:

【中文标题】使用 AJAX 进行 GET 的 Razor Pages PageModel 绑定【英文标题】:Razor Pages PageModel binding for GET with AJAX 【发布时间】:2021-08-20 20:12:29 【问题描述】:

我无法让绑定适用于一组特定的情况。我正在使用带有 ASP.NET Core 3.1 的 Razor Pages 来充当为 AJAX 调用提供服务的控制器。我已经在 Startup.cs 中添加了防伪令牌:

services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");

我的 AJAX 调用在调用中包含防伪功能,如下所示:

function getTankConfig(tankId) 
    var json =  id: tankId ;
    $.ajax(
        cache: false,
        type: "GET",
        beforeSend: function (xhr) 
            xhr.setRequestHeader("XSRF-TOKEN",
                $('input:hidden[name="__RequestVerificationToken"]').val());
        ,
        url: "/Tank/Config",
        contentType: "application/json",
        dataType: "json",
        data: JSON.stringify(json),
        success: getTankConfigSuccess
    );


function getTankConfigSuccess(data) 
    if (data !== null) 
        // do stuff with data
    

我已经尝试了所有绑定技术的组合。正常使用参数,添加[FromBody],添加公共属性并赋予[BindProperty]属性,使用[BindProperty(SupportsGet = true)]。使用控制器执行此操作似乎很简单,但我没有发现让它与 Razor Pages 和 PageModels 一起工作的魔力。

这是我的 PageModel 类的简化版本:

public class TankConfigModel : PageModel

    public JsonResult OnGet(int id)
    
        TankConfigViewModel config = new TankConfigViewModel();
        config.Id = id;
        return new JsonResult(config);
    

任何帮助或指导将不胜感激。谢谢。

【问题讨论】:

您可以使用 @html.AntiForgeryToken() 将其添加到表单中并且我认为您希望使用 POST 而不是 GET ...您不需要绑定。 (使用 ajax 调用时还要检查双重帖子...我想我必须删除布局中的 @renderbody 内容,并重新编写页眉/页脚。) 感谢您的回复。我没有使用表格。这是纯 javascript。我只在数据要更改时使用 POST 方法。如下所述,我计划改为仅使用查询字符串。 啊,好吧...不要认为 GET 请求根本需要防伪令牌。在那种情况下没有必要。 (这些令牌的目的是防止假冒......如果使用,攻击者必须在中间扮演人,这使得他们更难......) 【参考方案1】:

您必须将此添加到您的剃须刀页面

@page "id"

并修复 ajax

$.ajax(
        type: "GET",
        url: "/Tank/Config/"+tankId,
        beforeSend: function (xhr) 
            xhr.setRequestHeader("XSRF-TOKEN",
                $('input:hidden[name="__RequestVerificationToken"]').val());
        ,
       
        success: function (result) 
                           getTankConfigSuccess(result)
                    ,
         error: function (jqXHR) 

                    
    );

【讨论】:

感谢您的回答。我开始相信 GET 请求从来都不是用来处理请求正文中的任何数据的。所以,我可能只会使用查询字符串将 id 传递给处理程序。这种方法不需要任何绑定属性,并且不需要防伪令牌即可工作。

以上是关于使用 AJAX 进行 GET 的 Razor Pages PageModel 绑定的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core Razor Pages中ajax get和post的使用

在 Razor 视图中使用 Ajax 进行 Asp.Net Core 表分页

.NET Core 从 Razor 页面向控制器进行 AJAX 调用

Razor_06 列表的查询

如何使字形图标成为 Razor 中的 ajax 链接文本?

Jquery ajax get request to aspx web method not hit the breakpoint in the method and error is json pa