我有一个使用 .NET Framework 4.6 的 ASP.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部分的初始配置问题。缺少“驼峰式”配置?还有别的事吗?我要疯了...
经过深入调查,我终于找到了解决方案:
我需要用
[FromBody]
属性来修饰该方法:
[HttpPost]
public async Task<JsonResult> Pay([FromBody] PayRequestVM input) {
...
}
在 ASP.NET Core 中,
[FromBody]
属性显式告诉模型绑定器在请求正文中查找数据。如果没有 [FromBody]
模型绑定会查看各种来源,包括查询字符串和表单数据,但它期望 JSON 数据与操作方法的参数完全匹配。
一个很好的解释这里。