17

Я новичок в ядре MVC.Asp.net core MVC post параметр всегда null

Я создал проект с сердечником MVC, который имеет контроллер. Этот контроллер имеет методы Get и Post. Если я передаю данные методу Get с использованием строки запроса, он отлично работает, но когда я передаю сложный JSON для отправки метода, он всегда показывает мне null.

Вот что я делаю:

Отправить запрос

URL: http://localhost:1001/api/users 
Content-Type: application/json 
Body: 
{ 
    "Name":"UserName", 
    "Gender":"Gender of the user", 
    "PhoneNumber":"PhoneNumber of the user" 
} 

Вот метод действия Post

[HttpPost] 
[Route("api/users")] 
public async Task<IActionResult> Post([FromBody]User newUser) 
{ 
    ... 
} 

Когда запрос пост называется, то NEWUSER всегда показывает мне null. И если я удаляю атрибут [FromBody], то я получаю объект newUser, но все его поля равны нулю.

Пожалуйста, помогите мне и проведите меня в этом выпуске.

EDITED

Вот мой Пользователь класс

public class User{ 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Gender { get; set; } 
    public string PhoneNumber { get; set; } 
} 

я сделал то же самое, как описано here данных JSON, но по-прежнему получает нуль.

+0

У вас есть какое-либо промежуточное ПО, которое может перехватить запрос? вы сделали прокрутку или скрипичный след? – Toxicable

+1

Нет, я посылаю запрос, используя почтальон. Я не знаю, как отследить запрос с помощью скрипача. –

+0

Загрузите скрипач, и следите за запросами и проверяйте их, убедитесь, что вы отправляете совпадения по фактическому запросу. Это действительно не сложно использовать – Toxicable

ответ

13

Это может быть из-за того, как нулевые значения решаются. Установите NullValueHandling для игнорирования в AddJsonOptions и посмотрите, работает ли это.

public void ConfigureServices(IServiceCollection services) 
{ 
    services 
     .AddMvc() 
     .AddJsonOptions(jsonOptions=> 
     { 
      jsonOptions.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 
     }); 
} 
+0

Спасибо, приятель, он работал отлично. Теперь я знаю, почему полученные данные были пустыми. –

+1

СПАСИБО. Я не думаю, что я бы понял это без вашей помощи. – m4design

-6

Ваш класс Пользователь должен иметь конструктор без параметров по умолчанию для этого, чтобы работать ...

+0

Не имеет ли он неявный конструктор без параметров, если вы не укажете каких-либо конструкторов? –

+0

Нет, это не так. Вы должны явно определить конструктор без параметров, потому что система привязки модели должна создать экземпляр объекта, чтобы заполнить его общедоступные свойства. – Issac

+4

Я считаю, что вы ошибаетесь в связи с необходимостью явно определенного конструктора без параметров, если нет других конструкторов. Если у вас вообще нет конструкторов, компилятор их генерирует. См. Https://msdn.microsoft.com/en-us/library/ms173115.aspx, четвертый абзац. Правда, однако, если вы уже определили другие конструкторы, вам нужно будет определить явный конструктор без параметров, если вы хотите его использовать. –

0

Вы на Microsoft.AspNetCore.Mvc 1.0.0?

Если вы, попробуйте отправить этот объект, как ваше тело в запросе (верблюд обсаженных свойства):

{ 
    "name":"UserName", 
    "gender":"Gender of the user", 
    "phoneNumber":"PhoneNumber of the user" 
} 
+0

Да, я использую Microsoft.AspNetCore.Mvc 1.0.0 Также я отправляю данные в тело запроса –

+0

Да, но используйте имена свойств с именами верблюдов в JSON. – steamrolla

+0

Это значение по умолчанию в 'Microsoft.AspNetCore.Mvc 1.0.0'. – steamrolla

2

Я создал новый проект ASP.NET Core, добавили функциональность, и она работает. Оформить заказ this project на github.

Также см скриншота лога с простым общением с этим контроллером из консоли браузера: Console output

10

Обратите внимание на оригинальный метод Post([FromBody] User newUser)

Для будущих читателей от Google, эта же проблема может возникнуть, если метод был Post(User newUser)

Обратите внимание на отсутствие из [FromBody]. Это отход от предыдущих версий MVC, где эти параметры были , как правило,.

Если вы существующий MVC5 разработчика, который находит эту страницу относительно AspNetCore.MVC, убедитесь, что дважды проверьте, что у вас есть [FromBody] оформлены в соответствующих случаях.