Почему значение, которое мой контроллер получает от Axios, всегда равно нулю?

#javascript #c# #asp.net-core #axios #asp.net-core-webapi

Вопрос:

У меня есть этот простой вызов Axios:

  var payload = "this is a test";
 const dt = { rockText: payload };
 const request = axios.put(`/api/rocks/${rockId}/rockText`, dt);
 

Он подключается к контроллеру, подобному этому:

     [HttpPut("{id}/rockText")]
    public IActionResult PutRockText(Int32 id, [FromBody] string rockText)
    { ... }
 

Но rockText всегда имеет значение null в контроллере, хотя я знаю, что это не так, когда используется Axios.

Я перепробовал так много вариантов вызова Axios, но он всегда равен нулю.

Как я могу заставить это работать?

Комментарии:

1. С какой стороны проблема — работает ли запрос от другого клиента?

2. @jonrsharpe У меня сейчас только один клиент

3. Почтальон, завиток, fetch в твоем браузере,…? Вам нужно выполнить некоторую базовую отладку, чтобы вы знали, нужно ли исправлять отправку или получение запроса.

4. @jonrsharpe извините, я понимаю, что вы имеете в виду. Я попробовал это через почтальона, и он также был пустым со стороны api.

5. @jonrsharpe, но id , тем не менее, все в порядке. :/

Ответ №1:

Если вы хотите передавать данные json с помощью axios,вам нужно установить Content-Type ,вот демонстрационная версия:

axios(я использую 1 для замены ${rockId} для тестирования):

 var payload = "this is a test";
const request = axios.put(`/api/rocks/1/rockText`, JSON.stringify(payload),
               { headers: { 'Content-Type': 'application/json' } });
 

Контроллер:

 [HttpPut("{id}/rockText")]
public IActionResult PutRockText(int id,[FromBody]string rock)
{
     return Ok();
}
 

Результат:
введите описание изображения здесь

Ответ №2:

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

Я бы создал класс для представления json, который вы отправляете:

 public class Rock
{
    public string RockText { get; set; }
}


[HttpPut("{id}/rockText")]
public IActionResult PutRockText(Int32 id, [FromBody] Rock rock)
{ ... }
 

В качестве альтернативы вы можете попробовать передать строку из axios:

 var payload = "this is a test";
const request = axios.put(`/api/rocks/${rockId}/rockText`, payload);
 

Комментарии:

1. Спасибо, я изменил его на ваш 2-й пример, но он по-прежнему равен нулю… однако Рокид проходит нормально

2. @SkyeBoniwell ты попробовал мое первое предложение? Это то, что я бы рекомендовал

3. Я только что сделал, но он по-прежнему равен нулю 🙁

4. Я протестировал, и это работает для меня с помощью postman, вам нужно будет предоставить более подробную информацию об отладке @SkyeBoniwell