1

我在使用 Angular 5+ 的 ASP.NET Core 2.0 Web API 使用数据时遇到问题。

这是我已经完成的步骤:

  1. 我已经构建了一个 ASP.NET Core 2.0 WebAPI 并将其部署在服务器上。我可以毫无问题地使用邮递员或招摇的数据。
  2. 然后我用 NSwagStudio 为我的 Angular 前端应用程序创建了客户端 TypeScript 服务类。

现在的问题是:我可以从前端应用程序向 wep api 发出请求,并且我还收到了 JSON 格式的正确数据。但是,当映射过程到生成的客户端服务类中的 poco 对象时,有些东西不起作用。我总是得到一个具有空属性的对象。

这是我的代码:

product.service.ts
export class ProductService {
  private http: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> };
  private baseUrl: string;
  protected jsonParseReviver: (key: string, value: any) => any = undefined;

  constructor() {
      this.http = <any>window;
      this.baseUrl =  "http://testweb01/FurnitureContractWebAPI";
  }

  getByProductId(productId: string): Promise<Product[]> {

      let url_ = this.baseUrl + "/api/Product/GetById?";
      if (productId === undefined)
          throw new Error("The parameter 'productId' must be defined.");
      else
          url_ += "productId=" + encodeURIComponent("" + productId) + "&"; 
      url_ = url_.replace(/[?&]$/, "");

      let options_ = <RequestInit>{
          method: "GET",
          headers: {
              "Content-Type": "application/json", 
              "Accept": "application/json"
          }
      };

      return this.http.fetch(url_, options_).then((_response: Response) => {
          return this.processGetByProductId(_response);
      });
  }

protected processGetByProductId(response: Response): Promise<Product[]> {
      const status = response.status;
      let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
      if (status === 200) {
          return response.text().then((_responseText) => {
          let result200: any = null;
          let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
          if (resultData200 && resultData200.constructor === Array) {
              result200 = [];
              for (let item of resultData200) {
                var x = Product.fromJS(item);
                //console.log(x);
                result200.push(Product.fromJS(item));
              }

          }
          //console.log(result200);
          return result200;
          });
      } else if (status !== 200 && status !== 204) {
          return response.text().then((_responseText) => {
          return throwException("An unexpected server error occurred.", status, _responseText, _headers);
          });
      }
      return Promise.resolve<Product[]>(<any>null);
  }

这里是 Product 类的方法:

init(data?: any) {
    console.log(data);
      if (data) {
          this.productId = data["ProductId"];
          this.productNameDe = data["ProductNameDe"];
          this.productNameFr = data["ProductNameFr"];
          this.productNameIt = data["ProductNameIt"];
          this.supplierProductId = data["SupplierProductId"];
          this.supplierProductVarId = data["SupplierProductVarId"];
          this.supplierProductVarName = data["SupplierProductVarName"];
          this.supplierId = data["SupplierId"];
          this.supplierName = data["SupplierName"];
          this.additionalText = data["AdditionalText"];
          this.installationCost = data["InstallationCost"];
          this.deliveryCost = data["DeliveryCost"];
          this.sectionId = data["SectionId"];
          this.categorieId = data["CategorieId"];
          this.price = data["Price"];
          this.ean = data["Ean"];
          this.brand = data["Brand"];
          this.modifiedDate = data["ModifiedDate"] ? new Date(data["ModifiedDate"].toString()) : <any>undefined;
          this.categorie = data["Categorie"] ? ProductCategory.fromJS(data["Categorie"]) : <any>undefined;
          this.section = data["Section"] ? ProductSection.fromJS(data["Section"]) : <any>undefined;
      }
  }

  static fromJS(data: any): Product {
      data = typeof data === 'object' ? data : {};
      let result = new Product();
      result.init(data);
      return result;
  }

在我查看数据时的init()方法中,它包含我需要的所有值。但是,例如,当我使用data["ProductId"]时,该值为空/未定义。

有人可以帮忙吗?

谢谢

这是我的控制台输出数据对象的屏幕截图: 在此处输入图像描述

4

2 回答 2

0

NSwag 配置错误,使用 DefaultPropertyNameHandling: CamelCase for ASP.NET Core

或者使用新的基于 asp.net core api explorer 的 swagger 生成器,它会自动检测合约解析器。(实验性)

于 2018-05-18T17:33:00.767 回答
0

现在我可以弄清楚,我可以将数据对象直接转换为产品:

  init(data?: any) {
    var p = <Product>data;

这行得通,但我问自己,为什么生成的类有一个带有手动设置属性的初始化方法,当可以直接转换对象时?

于 2018-05-17T20:06:06.693 回答