【问题标题】:JSON serialization/deserialization not working when migrating to ASP.Net Core MVC迁移到 ASP.Net Core MVC 时 JSON 序列化/反序列化不起作用
【发布时间】:2020-03-16 18:53:59
【问题描述】:

我们正在将一个站点从 ASP MVC .Net Framework 迁移到 .Net Core。在许多情况下,我们会从页面向控制器发出 ajax POST 请求:

js:

var request = { Name: "bar" };
$.ajax({
    url: "/Home/foo",
    type: "POST",
    data: JSON.stringify(request),
    dataType: 'json',
    contentType: "application/json; charset=utf-8",
    success: function (response) {
        console.log();
    }
});

c#控制器:

[HttpPost]
public async Task<JsonResult> foo(FooRequest request)
{
    //request.Name is empty
    return Json(new { msg = "Success" });
}

c#型号:

public class FooRequest
{
    public string Name { get; set; }
}

这一切都在 .Net Framework 中有效,但在 Core 中失败了如果接收到的对象的所有属性都为空

我尝试过同时使用AddJsonOptions:

services.AddControllersWithViews()
    .AddJsonOptions(option =>
    {
        option.JsonSerializerOptions.PropertyNamingPolicy = null;
        option.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
    });

...和AddNewtonsoftJson:

services.AddControllersWithViews()
    .AddNewtonsoftJson(option =>
    {
        option.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();
    });

...但它们都不起作用。

我需要做什么才能在 .Net Core 中获得与在 .Net Framework 中相同的行为?

更新

我从 Postman 调用 endoint 得到相同的行为(request.Name 为 null):

POST /home/foo HTTP/1.1
Host: localhost:44393
Content-Type: application/json

{ "Name": "bar" }

我也尝试过序列化请求:

var request = { Name: "bar" };
$.ajax({
    url: "/Home/foo",
    type: "POST",
    data: request,
    dataType: 'json',
    contentType: "application/json; charset=utf-8",
    success: function (response) {
        console.log();
    }
});

...但结果相同

【问题讨论】:

  • 应该更清楚了,但是接收到的对象的所有属性都是空的。
  • 您检查过您发布的内容吗?你为什么要在你发布的对象上调用 JSON.stringify?
  • 因为这是让它在 .Net Framework 中工作的唯一方法。我很乐意改变这一点,但我使用 data:request 遇到了同样的问题,

标签: c# asp.net-core


【解决方案1】:

尝试将FromBodyAttribute 添加到您的参数中:

[HttpPost]
public async Task<JsonResult> foo([FromBody] FooRequest request)
{
    //request.Name is empty
    return Json(new { msg = "Success" });
}

如果你用ApiControllerAttribute装饰你的控制器,你可以省略这个属性

【讨论】:

  • 谢谢...只是一个简短的问题,有没有办法在 Startup.cs 中设置它,因为我有很多此类方法(驻留在我的正常操作中)?跨度>
  • 很遗憾没有。唯一的“全局”方式是对 Http 请求使用 ApiControllers,对视图使用普通控制器。因此,如果您在使用 [ApiController] 装饰的控制器中重构您的 api 调用,您应该可以省略它。
  • 你可以用一个动作过滤器来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2023-04-09
  • 2015-09-28
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多