Angular + Asp Core 2 http Post数据始终为空

时间:2018-07-04 12:04:24

标签: angular asp.net-core

我在这个问题上苦苦挣扎了很长时间。

我有一个用Angular 6和WebApi创建的客户端应用程序,该应用程序是用ASP Core 2.1创建的。

对于我的POST请求,我要做类似的事情。

const params = {
  TestData: newActions,
  ExportAndExecute: true
};

this.httpClient.post('/tests/export', params, {headers: {}}).subscribe((result) => {
  console.log(result);
});

其中httpClient.post方法为:

post(route: string, params: any, headers: object) {
return new Observable<any>(subscriber => {
  this.httpClient.post<any>(this.baseUrl + route, params, headers).subscribe((result) => {
    subscriber.next(result);
  }, (error: Response) => {
    this.handleRequestError(error);
  });
});

}

我的API控制器操作如下:

[HttpPost]
[Route("/api/[controller]/export")]
[Authorize(AuthenticationSchemes = "JwtBearer")]
public async Task<HttpStatusCode> ExportTest( [FromBody] ExportTestModel model)
{
    var result = HttpStatusCode.MisdirectedRequest; 
}

模型类是:

public class ExportTestModel
{
    public List<BsonDocument> TestData { get; set; }
    public bool ExportAndExecute { get; set; }
}

我不知道为什么每次我从客户端发送数据时,在控制器操作中它为null。我试图将其作为字符串对象发送,在控制器中以objectJObject的形式接收,但没有任何效果。

我可以补充一点,如果我以JObject的身份接收数据,则可以正确看到它,但我不想这样做。

我感到很愚蠢,但也许有人可以指出我在我的方法中做错了什么。

2 个答案:

答案 0 :(得分:1)

看看您的示例代码,我跳到两个选择:

  1. 错误的标题。因为您显式地将一个空的标头对象设置为第三个参数,所以可能导致Angular不为要发送的内容类型(application / json)添加默认的HTTP标头。如果您不告诉ASP.NET Core您要发送哪种数据,则ASP.NET Core不会在乎它,也不应用模型绑定。解决此问题的方法非常简单,只需在您的this.httpClient.post()调用中删除第三个参数即可。

    this.httpClient.post('/tests/export', params).subscribe(result => {
      console.log(result);
    });
    

    您可以通过检查Web开发人员工具栏中的网络流量来验证是否设置了此标头。

  2. 区分大小写。在JavaScript(以及JSON)中,骆驼框是标准的。您的params对象有一个TestData和一个ExportAndExecute,两者均以pascal大小写。可能是模型联编程序对大小写敏感。

答案 1 :(得分:0)

这对我使用Angular 6 HttpClient和Asp.Net Core 2.0或2.1有用

在您的控制器中:

import animals.Dog;
import animals.Eagle;
import animals.IAnimal;

public class Test {

    public static void main(String[] args) {
        IAnimal dog = new Dog();
        IAnimal eagle = new Eagle();
        dog.feed();
        eagle.feed();
    }

}

为您服务:

const params = {
  TestData: newActions,
  ExportAndExecute: true
};

this.dataService.postData(params).subscribe( 
    data => {
       console.log('post OK !');
    },
    error => {
       console.log('post error !');
    }
);