abp.ajax 调用失败

问题描述 投票:0回答:1

我有一个使用 .NET Framework 4.6ASP.NET 样板 7.4 MVC 应用程序,现在我正在迁移到 ASP.NET Core 6 (.NET6)

为此,我从使用网站向导生成的新 ASP.NET Core MVC 项目开始(请参阅https://aspnetboilerplate.com/Templates),现在我将所有原始代码迁移到全新的 Web应用程序。

到目前为止一切正常,但现在我在通过

Abp.ajax
javascript 函数调用 MVC 控制器时遇到问题。

这是 MVC 控制器:

public class BookMgmController : AbpController {
    ...

    [HttpPost]
    public async Task<JsonResult> Pay(PayRequestVM input) {
        ...
    }
}

与:

public class PayRequestVM {
    public string CustomerName { get; set; }
    public string CustomerSurname { get; set; }
    public bool PayAllAmount { get; set; }
}

嗯,在旧版 MVC 应用程序中,我通过 js 成功调用了它:

var input = {
    customerName: 'Gino',
    customerSurname: 'Latino',
    payAllAmount: true
};

abp.ajax({
    url: '/BookMgm/Pay',
    type: 'POST',
    data: JSON.stringify(input)
});

问题是,当我在新的 ASP.NET Core 应用程序中测试相同的代码时,控制器的

Pay
方法失败,因为 c# 端的输入
PayRequestVM
对象的属性都是
null
(或
 false
)。

请注意,只有当我通过 js 调用 MVC 控制器方法时才会出现问题。事实上,如果我将任何内容(通过 js)发布到我的远程应用程序服务(Web api),一切都会正常。

我怀疑这是MVC部分的初始配置问题。缺少“驼峰式”配置?还有别的事吗?我要疯了...

asp.net-core aspnetboilerplate
1个回答
0
投票

经过深入调查,我终于找到了解决方案:

我需要用

[FromBody]
属性来修饰该方法:

[HttpPost]
public async Task<JsonResult> Pay([FromBody] PayRequestVM input) {
    ...
}

在 ASP.NET Core 中,

[FromBody]
属性显式告诉模型绑定器在请求正文中查找数据。如果没有
[FromBody]
模型绑定会查看各种来源,包括查询字符串和表单数据,但它期望 JSON 数据与操作方法的参数完全匹配。

一个很好的解释这里

© www.soinside.com 2019 - 2024. All rights reserved.