Сообщение об ошибке Из Углового в Сетевое ядро HTTP 404

#sql-server #angular #asp.net-core #.net-core

Вопрос:

Я создаю веб-программное обеспечение fullstack и использую Angular,Net Core и Mssql…Мой веб-api готов,и если я использую Postman, то никаких проблем не возникнет. Я могу перечислить все продукты в своей таблице начальной загрузки на веб-странице. Но если отправлять информацию из угловой(угловой формы), это дает ошибку. «Значение JSON не удалось преобразовать в System.Int32» Похоже на ошибку приведения типа. Я изменил правило проверки с categoryId: ["", Validators.required ] на categoryId: [parseInt(""), Validators.required] или categoryId: [0, Validators.required] Тип переменной моей модели-число.Я ничего не понял. Заранее спасибо…

Весь мой проект на Github: https://github.com/SuperSayiyajin/FullStack_Workshop/tree/main/Northwind_Final

введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь

Это мой метод контроллера Net Core WebAPI:

 [HttpPost("add")]
public IActionResult Add(Product p)
{
    var result = _productService.Add(p);
    if (result.Success)
    {
        return Ok(result);
    }
    return BadRequest(result);
}
 

Это мой модуль добавления продукта:

 import { ToastrService } from 'ngx-toastr';
import { ProductService } from './../../services/product.service';
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder, FormControl, Validators } from "@angular/forms";

@Component({
    selector: 'app-product-add',
    templateUrl: './product-add.component.html',
    styleUrls: ['./product-add.component.css']
})
export class ProductAddComponent implements OnInit {
    addProductForm: FormGroup;
    constructor(private formBuilder: FormBuilder,
        private productService: ProductService,
        private toastrService: ToastrService) { }

    ngOnInit(): void {
        this.createAddProductForm();
    }

    createAddProductForm() {
        this.addProductForm = this.formBuilder.group({
            productName: ["", Validators.required],
            categoryId: ["", Validators.required],
            unitsInStock: ["", Validators.required],
            unitPrice: ["", Validators.required],
        });
    }

    addProduct() {
        if (this.addProductForm.valid) {
            let product = Object.assign({}, this.addProductForm.value);
            this.productService.addProduct(product).subscribe(response => {
                console.log(response);
                this.toastrService.success(response.message, "Completed")
            }, responseError => {
                console.log(responseError.error);
                this.toastrService.error(responseError.error);
            });
        } else {
            this.toastrService.error("Product is not valid", "Error");
        }

        //console.log(product);
    }
}
 

Это мой продукт, услуга.

 import { ResponseModel } from './../Models/responseModel';
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { ListResponseModel } from '../Models/listResponseModel';
import { Product } from '../Models/product';

@Injectable({
    providedIn: 'root',
})
export class ProductService {
    apiURL = 'https://localhost:44324/api/';

    constructor(private httpClient: HttpClient) { }

    getProducts(): Observable<ListResponseModel<Product>> {
        let newPath = this.apiURL   'products/getall';
        return this.httpClient.get<ListResponseModel<Product>>(newPath);
    }

    getProductsByCategoryId(
        categoryId: number
    ): Observable<ListResponseModel<Product>> {
        let newPath =
            this.apiURL   'products/getallbycategoryid?categoryId='   categoryId;
        return this.httpClient.get<ListResponseModel<Product>>(newPath);
    }

    addProduct(product: Product): Observable<ResponseModel> {
        return this.httpClient.post<ResponseModel>(this.apiURL   "products/add", product);
    }
}
 

Это product-add.html

 <div class="content">
    <div class="col-md-12">
        <div class="card">
            <div class="card-header">
                <h5 class="title">Add Product</h5>
            </div>
            <div class="card-body">
                <form [formGroup]="addProductForm">
                    <div class="mb-3">
                        <label class="Labels" for="productName">Product Name</label>
                        <div class="form-group">
                            <input class="col-9" type="text" id="productName" formControlName="productName"
                                class="form-control" placeholder="Product Name" />
                        </div>
                    </div>
                    <div class="mb-3">
                        <label class="Labels" for="categoryId">Product Category</label>
                        <div class="form-group">
                            <input type="text" id="categoryId" formControlName="categoryId" class="form-control"
                                placeholder="Category Id" />
                        </div>
                    </div>

                    <div class="mb-3">
                        <label class="Labels" for="unitsInStock">Product Stock</label>
                        <div class="form-group">
                            <input type="text" id="unitsInStock" formControlName="unitsInStock" class="form-control"
                                placeholder="Stock" />
                        </div>
                    </div>
                    <div class="mb-3">
                        <label class="Labels" for="unitPrice">Product Price</label>
                        <div class="form-group">
                            <input type="text" id="unitPrice" formControlName="unitPrice" class="form-control"
                                placeholder="Price" />
                        </div>
                    </div>
                </form>
            </div>
            <div class="card-footer">
                <button class="btn btn-fill btn-primary" (click)="addProduct()">Add Product</button>
            </div>
        </div>

    </div>

</div>
 

Комментарии:

1. Пожалуйста, опубликуйте полезную нагрузку вашего HTTP-запроса в нижней части вкладки «Сеть» — > «Заголовки», а также определение класса продукта в .net core.

2. Спасибо за ваш быстрый ответ. Я добавил их в первое сообщение в виде рисунка 4-5-6. Похоже, что angular отправляет их в виде строки.

3. Вы можете попробовать нажать «Просмотреть источник» в полезной нагрузке запроса, скопировать JSON и вставить его в Postman, и посмотреть, не возникнет ли у вас та же ошибка?

4. В случае, если вставленный JSON не работает, виновником может быть строковый тип, отправленный из интерфейса. Вы можете попытаться решить эту проблему, изменив тип= «текст» на тип= «число» для соответствующих полей ввода. Вы также можете вручную выполнить синтаксический анализ/синтаксический анализ после сбора значений формы и перед отправкой API

5. Да, это дает ту же ошибку. Целые числа выглядят как строка, когда я отправляю их в свой api

Ответ №1:

Спасибо, Айсикул. Похоже, я так сильно устала.Тип ввода=»число» исправлена проблема.

 <div class="form-group">
       <input type="number" id="categoryId" formControlName="categoryId" class="form-control" placeholder="Category Id" />
</div>
 

Ответ №2:

categoryId в классе продукта указан номер типа, поэтому да, вы должны использовать categoryId: [0, Validators.required] или categoryId: [null, Validators.required] и <input type="number">

И причина, по которой вы не получили ошибку компиляции, заключается в том, что весь ваш код Typescript переводится на JavaScript, а в JS у нас нет проверки типов, как в typescript. Пожалуйста, обратите внимание, что this.form.value это тип any, поэтому typescript также не обнаружил его.

Комментарии:

1. Они не работали… Идентификатор категории: [0, Валидаторы.требуется], Идентификатор категории: [«», Валидаторы.требуется], Идентификатор категории: [parsenInt(«»), Валидаторы.требуется], идентификатор категории: [null, Валидаторы.требуется],

2. итак, проблема была с типом ввода, я отредактировал свой ответ, чтобы он был полностью правильным.