Хотя вы еще не опубликовали свой фактический класс контроллера, я вполне уверен, что он не украшен атрибутом [ApiController]
:
[ApiController]
public class MyAwesomeController : ControllerBase
Похоже, вы используете стандартныйКонтроллер в стиле MVC, который, хотя между ним и контроллером API нет real разницы, теперь типично наследовать от ControllerBase
(а не Controller
) и добавлять атрибут [ApiController]
вконтроллеры, которые будут функционировать как API, а не возвращать представления.Это приводит к ряду различий, главное из которых заключается в том, как здесь связаны ваши данные.
Источником привязки по умолчанию для параметра класса является [FromForm]
, то есть x-www-form-urlencoded
или multipart/form-data
тело закодированного запроса - , а не application/json
.Чтобы принять что-то вроде application/json
, application/xml
и т. Д. К параметру должен быть применен атрибут [FromBody]
:
public IActionResult AddToCart([FromBody]List<ProductInsert> data)
Когда ваш контроллер имеет атрибут [ApiController]
, эта логика меняется на противоположную.,[FromBody]
становится значением по умолчанию, и вы должны применить [FromForm]
, если вам нужно принять стандартное сообщение в формате HTML.
Длинным и коротким, немедленное решение - добавить [FromBody]
к вашему параметру, так как выВы пытаетесь отправить JSON.
Однако у вас также есть некоторые другие проблемы, которые приведут к появлению уродливых голов, как только вы решите свою непосредственную проблему.А именно, вы используете AJAX для выполнения стандартного действия в стиле MVC, которое выполняет перенаправление.AJAX-запросы выполняются через тонкий клиент, что означает, что с ответом автоматически ничего не происходит автоматически.AJAX-запрос может быть сделан для автоматического следования за перенаправлением, но в результате вы просто получите всю страницу, на которую перенаправлены, чтобы вернуться в ваш успешный обратный вызов AJAX.На данный момент, ничего не поделаешь.Вы не можете изменить полностью HTML-документ через JS.Если вы не выполните автоматическое отслеживание перенаправления, вы можете получить URL-адрес из заголовка Location
ответа, а затем установить location
в JS.Однако это сводит на нет всю цель использования AJAX в первую очередь: вы могли бы просто сделать стандартную форму публикации, так как результат будет точно таким же, просто без кучки ненужных JS.
Если вы хотите использовать AJAX, то конечная точка, которую вы ударили, должна вернуть что-то, с чем вы можете работать: объект JSON или частичный фрагмент HTML.Если вы решите вернуть JSON, вам нужно будет использовать эти возвращенные данные, чтобы сделать что-то полезное на странице, например, сообщить пользователю каким-либо образом, что продукт был успешно добавлен в корзину.Если вы вернете частичное, то вы бы выбрали некоторый элемент в DOM и заменили его HTML этим частичным HTML-документом.Короче говоря, независимо от того, что возвращается вашему успешному обратному вызову AJAX, вы должны что-то с ним делать - автоматически ничего не происходит.