В вашем сообщении есть несколько разных вопросов, на которые я был бы рад ответить для вас:
Почему язык не заполняется в вашем методе контроллера?
Вы указываете, что метод на вашем контроллере API выглядит так:
public IActionResult Post(Language lan)
{
// logic
return Ok();
}
Вы не указываете, настраиваете ли вы конечные точки в своей настройке, поэтому я предполагаю, что нет. Вы должны обновить это с помощью, чтобы вместо этого выглядеть следующим образом. Это сделает две вещи: 1) первая строка проинформирует ASP. NET Core, что этот метод должен соответствовать запросу POST с указанным шаблоном, и 2) атрибут [FromBody]
в аргументе сообщает ASP. NET Ядро, из которого следует заполнить значение (тело POST).
[HttpPost("Language")] //Handles a call to /language as you attempt in both your first and second calls from Angular.
public IActionResult Post([FromBody]Language lan)
{
//logic
return Ok();
}
Если вы используете async
и Task<T>
в последнем образце контроллера
Если вы не выполняете асинхронные действия в вашем комментарии //logic
, нет причин украшать метод async
или возвращать Task<IActionResult>
. Приведенного выше примера более чем достаточно.
Заполняете ли вы какие-либо данные для отправки?
Это стоило бы взглянуть на ваш сетевой запрос для проверки, но если вы не выполняете сопоставление в вашем компоненте Angular вы устанавливаете значение поля option на "language.key", но при вызове this.http.post
вы передаете lang
, а затем lan
, которые иным образом не используются в вашем примере кода. Таким образом, я не могу подробно разбираться в том, что там может происходить, но, возможно, стоит открыть ваши сетевые инструменты в вашем браузере и подтвердить, что запрос POST на ваш сервер действительно заполняется предполагаемыми данными из Angular компонент.
Возможно, вы неправильно понимаете синтаксис TypeScript на стороне Angular при обращении к this.http.post
. Вы указываете, что пытаетесь отправить данные с помощью:
this.http.post<LanguageInterface>("Language", lan).subscribe(result => {
console.log(result);
}, error => console.error(error));
Мое беспокойство здесь просто проистекает из этого второго примера, который вы даете, учитывая, что вы передаете данные из LanguageInterface
, предположительно в параметр lan
, но вы также ссылаетесь на это в this.http.post<LanguageInterface>
. Использование <> в методе заключается в том, чтобы ввести ответ, который вы ожидаете от вызова, и здесь не используется должным образом. Скорее, поскольку ваши методы контроллера в ASP. NET Core просто возвращают Ok()
ActionResult
, ожидаемого типа для ответа нет, поэтому здесь это не имеет особого смысла.
В этом случае ваш первый пост-вызов от Angular использует правильный синтаксис:
this.http.post("Language", lang).subscribe(result => {
console.log(result);
}, error => console.error(error));
Результат будет просто содержать HttpResponse
, и не ожидается, что в ответе вам будет тело, тем более тот, который должен быть напечатан для чего угодно.
Заключение
Опять же, я не могу говорить о том, как вы сопоставляете форму и ваш вызов для POST данных, но не стесняйтесь чтобы предоставить больше вашего образца кода и уведомить меня в комментарии, и я буду рад просмотреть его.
В вашем Angular компоненте
this.http.post("Language", lang).subscribe(result => {
console.log(result);
}, error => console.error(error));
Ваш ASP . NET Метод основного контроллера
[HttpPost("Language")] //Handles a call to /language as you attempt in both your first and second calls from Angular.
public IActionResult Post([FromBody]Language lan)
{
//logic
return Ok();
}
Почему [HttpPost("Language")]
нарушает это?
Вы изначально не указали подпись контроллера в своем вопросе, поэтому раньше это не было очевидно . Поскольку ваш атрибут [Route]
на контроллере установлен как [Route("[controller]")]
, он использует соглашение ASP. NET Core для использования имени контроллера перед «Controller» - в вашем случае ваш класс - «LanguageController. ", поэтому любой запрос к / Language будет указывать здесь как допустимый параметр.
Поскольку я тогда предложил маршрут на [HttpPost("Language")]
, это дополнительно добавляет шаблон, необходимый для сопоставления. Если вы отправили запрос POST на localhost:<port>/Language/Language
, вы увидите, что он соответствует методу, как и ожидалось.
Чтобы исправить это, просто измените атрибут в методе на [HttpPost]
и исключите аргумент шаблона будет означать, что это будет соответствовать вызову localhost:<port>/Language
, если это единственный метод POST с этой подписью в контроллере.