You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Razor Pages中AJAX POST提交JSON时[FromBody]接收参数为空如何解决

Razor Pages AJAX POST请求[FromBody]参数全为空问题

问题场景

在Razor Pages中实现AJAX POST提交功能时,后端OnPostTeam方法通过[FromBody]接收的TeamShort类型参数所有属性均为空,前端控制台打印的序列化后提交数据格式正常。

现有实现代码

前端AJAX逻辑

document.querySelector("#btnEditTeamSave").addEventListener("click", function editTeamSubmit(event) { 
    
    event.preventDefault();
    var theTeam = { Id:$('#btnEditTeamSave').val(), Name: $('#EditTeamName').val(), Description: $('#EditTeamDescription').val(), MachineId: $('#EditTeamMachine').val(),Active: $('#EditTeamActive').val(), Color: $('#EditTeamColorPicker').val()  };

       console.log(JSON.stringify(theTeam));
       $.ajax({
            type: "POST",
            url: "?handler=Team",
            contentType: "application/json; charset=utf-8",
            dataType: "JSON",
            data: JSON.stringify(theTeam),
            headers: {
                RequestVerificationToken:
                    $('input:hidden[name="__RequestVerificationToken"]').val()
            },
        })
            .done(function (result) {
                console.log(result);
            });
  },false)

后端模型与接口方法

public class TeamShort
{
    public int? Id { get; set; }
    public string? Name { get; set; }
    public string? Description { get; set; }
    public string? MachineId { get; set; }
    public bool? Active { get; set; }
    public string? Color { get; set; }
}

public IActionResult OnPostTeam([FromBody]TeamShort theTeam)
{
    return new JsonResult("succes"); 
}

故障原因

jQuery的.val()方法获取的所有表单值均为字符串类型,直接序列化后提交的JSON字段类型和后端模型定义不匹配,.NET默认的System.Text.Json反序列化器不会自动完成跨类型转换,最终导致整个实体绑定失败,所有属性赋值为空:

  • 后端Id为可空数字类型,前端提交的是字符串格式的数字
  • 后端Active为可空布尔类型,前端提交的是字符串格式的布尔值

修复方案

二选一即可:

  • 方案1:前端构造提交对象时手动转换字段类型
    var theTeam = { 
        Id: parseInt($('#btnEditTeamSave').val()), 
        Name: $('#EditTeamName').val(), 
        Description: $('#EditTeamDescription').val(), 
        MachineId: $('#EditTeamMachine').val(),
        Active: $('#EditTeamActive').val() === 'true' || $('#EditTeamActive').val() === '1', 
        Color: $('#EditTeamColorPicker').val()  
    };
    
  • 方案2:配置全局JSON序列化选项,允许从字符串读取数字/布尔值
    在Program.cs中添加如下配置:
    builder.Services.AddRazorPages()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString;
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
        });
    

注意:.NET 5及更早版本需要在Startup.cs的ConfigureServices方法中完成上述配置。

内容的提问来源于stack exchange,提问作者Alexandru Petre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:30:43