C# .Net Core 3.0 Angular application post请求参数始终为空
我想指出的是,这是我的第一个.Net Core Angular项目,如果这个问题看起来很明显,我很抱歉,我看过类似的问题,但我的问题仍然存在,所以我猜我做错了什么 因此,我在Visual Studio中创建了一个.Net Core 3.0 Angular项目,并创建了一个选择菜单,该菜单在更改时发送一个带有所选值的POST请求,但是在控制器上收到的POST始终为空 这是我的HTMLC# .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
<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();
}
}