JSON сериализация / десериализация не работает при миграции на ASP. Net Core MVC - PullRequest
2 голосов
/ 16 марта 2020

Мы переносим сайт с 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 Ядро, как и я. Net Framework?

Обновление

Я получаю то же поведение при вызове endoint из Postman (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();
    }
});

... но с тем же результат

1 Ответ

2 голосов
/ 16 марта 2020

Попробуйте добавить FromBodyAttribute к вашему параметру:

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

Вы можете опустить этот атрибут, если вы украсите свой контроллер с помощью ApiControllerAttribute

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...