Asp.net Core Razor Pages用Ajax Post提交数据后台接收值为null如何解决
问题原因
你通过AJAX传递的是JSON格式的请求数据,ASP.NET Core Razor Pages默认的模型绑定逻辑是从表单字段获取值,不会自动读取JSON格式的请求体,所以参数绑定失败为null。
解决方案
方案1:给后台参数添加[FromBody]特性
修改你的页面处理方法,在参数前加[FromBody]声明,让框架从JSON请求体中绑定数据:
public async Task<IActionResult> OnPostSave1Async([FromBody] CreateOrderViewModel order) { //some code }
该方案不需要改动前端的AJAX代码,适合传递复杂JSON结构的场景。
方案2:调整前端AJAX参数,使用表单格式提交
不需要修改后端代码,把AJAX里的JSON序列化和自定义contentType配置去掉,直接传递JS对象,框架会自动转成表单格式提交:
function save1() { var order = { SerialNo: '1'}; $.ajax({ type: "POST", url: "@Url.Page(\"Index\",\"Save1\")", headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() }, data: order, // 无需JSON序列化 // 删除自定义的contentType配置,使用默认的application/x-www-form-urlencoded dataType: "json", success: function () { alert('Success!'); }, failure: function (response) { alert('error!'); } }); }
该方案适合参数结构简单的场景。
注意事项
- 确保
CreateOrderViewModel类的属性都有公开的set访问器,你当前的代码已经满足该条件 - 你当前在headers里传递防伪令牌的逻辑是正确的,只需确认页面已生成
__RequestVerificationToken隐藏字段即可(默认Razor Pages页面包含form标签时会自动生成,无form标签的情况可以手动添加@Html.AntiForgeryToken()生成)
内容的提问来源于stack exchange,提问作者Arash Masir
相关产品推荐
相关产品推荐

