#c# #angular #asp.net-web-api
#c# #angular #asp.net-web-api
Вопрос:
Я пытаюсь сделать что-то относительно простое, но меня смущают все варианты, и мне нужна ваша помощь.
Я пытаюсь извлечь информацию из базы данных, передать ее через API и отобразить в таблице, которую я создал в Angular. Идея состоит в том, чтобы поместить всю производительность, статус которой равен 1, в некоторый список. Верните список в Angular и отобразите данные в таблице.
Я знаю, что есть много вариантов. По общему признанию, все примеры, которые я тестировал, находятся в проектах Angular и C #, как и следовало. Но каждый проект отличается от другого, и ни один пример не соответствует структуре моего проекта.
Итак, это мой код: (я знаю, что многие детали отсутствуют, и он не идеален, поэтому мне нужна помощь)
messages.component.html
<table id="customers">
<tr>
<th>productivity num</th>
<th>user ID</th>
<th>amount</th>
<th>Special comments</th>
<th>Accept/reject</th>
</tr>
<tr *ngFor="let item of productivityList">
<td>{{item.ProductivyCode}}</td>
<td>{{item.UserCode}}</td>
<td>{{item.ProductivityNum}}</td>
<td>{{item.Cmment}}</td>
<td>
<div>
<button class="button is-success">accept</button>
<button class="button is-danger">reject</button>
</div>
</td>
</tr>
</table>
messages.component.ts
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { UserService } from 'src/app/shared/services/user.service';
import { Productivity } from 'src/app/shared/models/productivity';
@Component({
selector: 'app-messages',
templateUrl: './messages.component.html',
styleUrls: ['./messages.component.css']
})
export class MessagesComponent implements OnInit {
constructor(private router: Router, private userservice: UserService) { }
productivityList: Productivity[];
ngOnInit():void {
this.getProductivityRequest();
}
getProductivityRequest() {
this.userservice.getProductivityRequest().subscribe((res) => {
this.productivityList = res;
if (res)
console.log("ok")
},
err =>
console.log("faild")
);
}
user.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http'
import { Observable, observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { User } from '../models/user.model';
import { Productivity } from '../models/productivity';
import { Time } from '@angular/common';
import { stringify } from 'querystring';
//import { read } from 'fs';
@Injectable({
providedIn: 'root'
})
export class UserService {
url: string = "https://localhost:44387/api/User/";
productivityList: Productivity[];
constructor(private http: HttpClient) { }
getProductivityRequest() {
return this.http.get(this.url 'getProductivityRequest');
}
UserController.cs //это мой проект на C#
using BL;
using DTO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Cors;
namespace WebApiSystem.Controllers
{
[EnableCors(origins: "http://localhost:4200", headers: "*", methods: "*", SupportsCredentials = true)]
[RoutePrefix("api/User")]
public class UserController : ApiController
{
[HttpGet]
[Route("getProductivityRequest")]
public IHttpActionResult GetProductivityRequest()
{
return Ok(UserService.GetProductivityRequest());
}
}
}
UserService.cs
using DAL;
using DTO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BL
{
public class UserService
{
public static IQueryable<dynamic> GetProductivityRequest()
{
using (Model2 db = new Model2())
{
db.Configuration.ProxyCreationEnabled = false;
db.Configuration.LazyLoadingEnabled = false;
IQueryable<dynamic> PList = db.ProductivityTbl.Select();//I want to make a condition within the SELECT that only an object whose status 1 will enter the list
return PList;
}
}
}
}
Я надеюсь, что это было достаточно понятно, и, возможно, вы сможете показать мне, как правильно написать код, и если у кого-нибудь есть другая идея, например, вернуть объект JSON, я был бы рад, если бы вы показали мне, как это сделать … спасибо!
Комментарии:
1. кажется, все правильно, что возвращает ваш API, когда вы тестируете его с postman?
2. ХОРОШО, простая проверка, просто выведите результаты вашего http-вызова в вашем компоненте. у вас все в порядке в «журнале», выводите «res», вы получаете что-нибудь? Если вы не запускаете Postman и не выполняете тот же http-вызов и не проверяете объект response на наличие ошибок.
3. Хорошо, он выдает мне следующую ошибку: доступ к XMLHttpRequest по адресу ‘ localhost: 44387 /api/User/getProductivityRequest ‘ из источника ‘ localhost: 4200 ‘ заблокирован политикой CORS: заголовок ‘Access-Control-Allow-Origin’ отсутствует на запрошенном ресурсе. Он также поставил передо мной эту проблему в предыдущий раз, когда я выполнял другую функцию. Тогда проблема заключалась в том, что атрибут был неправильно размещен, но теперь я не знаю, что не так
4. Привет, вы можете решить проблему CORS, настроив поведение в методе Configure() вашего класса Startup в веб-api …. добавлено в качестве ответа ниже для правильного отображения кода.
Ответ №1:
Чтобы устранить ошибку CORS при вызове web api из интерфейса Angular, вы можете настроить поведение в методе Configure() вашего класса Startup в web api…
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment()) app.UseDeveloperExceptionPage();
app.UseCors("AllowAll");
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
}
Комментарии:
1. Спасибо за попытку помочь Бену, я ценю… Прошу прощения за невежество, я довольно новичок в этом, и я не уверен, что точно понял, где я должен написать предложенный вами метод.
2. В проекте web api у вас должен быть файл с именем Startup.cs, который обычно используется для настройки asp.net конвейер обработки и службы регистрации для внедрения зависимостей. Этот файл будет содержать класс Startup, который, вероятно, уже определяет метод Configure(). Скорее всего, вам просто нужно добавить строку для «UseCors».
3. Ну, я проверил, и у меня нет такого файла.
4. Я предлагаю вам создать новый проект Web API с помощью мастера Visual Studio и просмотреть созданные файлы. Вы должны увидеть Startup.cs рядом с Program.cs в папке проекта.
5. Я попытался открыть новый проект и все еще не увидел там вышеуказанный файл. Я пытался добавить это вручную, но не смог реализовать интерфейс.