C# .Net Core 3.0 Angular application post请求参数始终为空

C# .Net Core 3.0 Angular application post请求参数始终为空,c#,typescript,post,.net-core,angular8,C#,Typescript,Post,.net Core,Angular8,我想指出的是,这是我的第一个.Net Core Angular项目,如果这个问题看起来很明显,我很抱歉,我看过类似的问题,但我的问题仍然存在,所以我猜我做错了什么 因此,我在Visual Studio中创建了一个.Net Core 3.0 Angular项目,并创建了一个选择菜单,该菜单在更改时发送一个带有所选值的POST请求,但是在控制器上收到的POST始终为空 这是我的HTML <select class="form-control" (change)="languageChanged

我想指出的是,这是我的第一个.Net Core Angular项目,如果这个问题看起来很明显,我很抱歉,我看过类似的问题,但我的问题仍然存在,所以我猜我做错了什么

因此,我在Visual Studio中创建了一个.Net Core 3.0 Angular项目,并创建了一个选择菜单,该菜单在更改时发送一个带有所选值的POST请求,但是在控制器上收到的POST始终为空

这是我的HTML

<select class="form-control" (change)="languageChanged($event.target.value)">
  <option *ngFor="let language of languages | keyvalue:returnZero" value="{{language.key}}">{{language.value}}</option>
</select>

在服务器端

public class Language
{
  public string language { get; set; } 
}
在HTTP帖子上,我也尝试了两件事

public IActionResult Post(Language lan)
{
  // logic
  return Ok();
}
我试着把方法改成

public async Task<IActionResult> Post([FromForm]Language lan)
公共异步任务Post([FromForm]语言lan)
任何帮助都将不胜感激!
谢谢你抽出时间

在你的帖子中有几个不同的问题,我很乐意为你解答:

为什么您的控制器方法中没有填充语言? 指示API控制器上的方法如下所示:

public IActionResult Post(语言局域网)
{
//逻辑
返回Ok();
}
您没有指明是否在设置中配置端点,因此我假定没有。您应该将其更新为如下所示。这将做两件事:1)第一行将通知ASP.NET Core此方法应将POST请求与命名模板匹配;2)参数中的
[FromBody]
属性告诉ASP.NET Core从何处填充值(您的POST正文)

您应该在上一个控制器示例中使用
async
Task
除非您在
//logic
注释中执行异步活动,否则没有理由用
async
装饰该方法或让它返回
任务。上面的例子就足够了

您是否正在填充任何要发送的数据? 这值得一看您的网络验证请求,但除非您在角度组件中进行一些映射,否则您将选项字段的值设置为“language.key”,但在调用
This.http.post
时,您传入了
lang
,然后传入了
lan
,这两种方法在示例代码中都没有使用。因此,我无法深入了解其中可能发生的情况,但在浏览器中打开网络工具并确认发送到服务器的POST请求实际上正在填充来自角度组件的预期数据可能是值得的

调用
this.http.post
您表示您正试图通过以下方式发送数据:

this.http.post(“语言”,lan).subscribe(结果=>{
控制台日志(结果);
},error=>console.error(error));
这里我的关注点仅仅来自您给出的第二个示例,假设您正在将数据从
语言接口
传入
lan
参数,但您也在
this.http.post
中引用了该参数。在方法上使用的是键入您期望从调用中得到的响应,但在此处未正确使用。相反,由于ASP.NET Core中的控制器方法都只返回一个
Ok()
ActionResult
,因此没有预期的响应类型,因此这在这里没有多大意义

在这种情况下,Angular的第一次post调用使用了正确的语法:

this.http.post(“语言”,lang).subscribe(结果=>{
控制台日志(结果);
},error=>console.error(error));
结果将只包含
HttpResponse
,并且在返回给您的响应中不会出现正文,更不用说应该键入任何内容

结论 再说一次,我不能说你是如何在表单和发布数据的调用之间进行映射的,但是请随意提供更多的示例代码,并在注释中通知我,我也很乐意查看它

在你的角分量内
this.http.post(“语言”,lang).subscribe(结果=>{
控制台日志(结果);
},error=>console.error(error));
您的ASP.NET核心控制器方法
[HttpPost(“Language”)]//在尝试从Angular进行第一次和第二次调用时处理对/Language的调用。
公共IActionResult Post([FromBody]语言lan)
{
//逻辑
返回Ok();
}
为什么
[HttpPost(“语言”)]
会打破这一点? 您最初没有在问题中提供控制器签名,因此这在以前并不明显。由于控制器上的
[Route]
属性设置为
[Route(“[controller]”)
,因此使用ASP.NET核心约定在“controller”之前使用控制器的名称-在您的情况下,您的类是“LanguageController”,因此对/Language的任何请求都将作为有效选项指向此处

因为我随后在
[HttpPost(“语言”)]
上建议了一条路线,这进一步增加了匹配所需的模式。如果您将POST请求发送到
localhost:/Language/Language
,您将看到它与预期的方法相匹配


为了解决这个问题,只需将方法上的属性更改为
[HttpPost]
,并删除模板参数,就意味着这将匹配对
localhost:/Language
的调用,假设这是控制器中唯一具有此签名的POST方法。

您的帖子中有几个不同的问题,我很乐意为您解答:

为什么您的控制器方法中没有填充语言? 指示API控制器上的方法如下所示:

public IActionResult Post(语言局域网)
{
//逻辑
返回Ok();
}
您没有指明是否在设置中配置端点,因此我假定没有。您应该将其更新为如下所示。这将做两件事:1)第一行将通知ASP.NET核心
public class Language
{
  public string language { get; set; } 
}
public IActionResult Post(Language lan)
{
  // logic
  return Ok();
}
public async Task<IActionResult> Post([FromForm]Language lan)
[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();
}
let post: LanguageInterface = {
  language: this.currentLanguage,
}
this.http.post("Language", post).subscribe(result => {
  console.log(result);
  this.data.changeLanguage(this.currentLanguage);
  this.toastr.success("Ok");
 }, error => console.error(error));
[ApiController]
[Route("[controller]")]
public class LanguageController : Controller
{

    [HttpPost]
    public IActionResult Post([FromBody]Language lan)
    {
        // logic
        return Ok();
    }

}