#asp.net #angular #asp.net-core #asp.net-web-api #angular9
#asp.net #angular #asp.net-ядро #asp.net-web-api #angular9
Вопрос:
Я пытаюсь удалить столбец, передав идентификатор из Angular 9 в ASP.NET Основной веб-API, но я не могу попасть в контроллер. Какую ошибку я здесь допустил? Я использую данные таблицы для выполнения SQL-запросов.
Контроллер
[Route("api/[controller]")]
[ApiController]
public class SettlementController : ControllerBase
{
public IConfiguration Configuration { get; }
private readonly DatabaseContext _context;
public SettlementController(IConfiguration configuration, DatabaseContext context)
{
Configuration = configuration;
_context = context;
}
// Delete settlement by id
[Route("DeleteById")]
[HttpDelete("{id}")]
public IActionResult DeleteSettlementById([FromBody] SettlementModel model) //sealed class of having Id only
{
var tid = model.Id;
try
{
string sConn = Configuration["ConnectionStrings:ServerConnection"];
using (SqlConnection con = new SqlConnection(sConn))
{
List<Object> objList = new List<Object>();
// This is the stored procedure. I pass in the "Id"
string query = "ST_PRO_DELETESETTLEMENT";
using (SqlCommand cmd = new SqlCommand(query))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@TID", SqlDbType.VarChar).Value = tid;
con.Open();
cmd.Connection = con;
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
objList.Add(new
{
//TID = reader[0].ToString(),
});
}
}
con.Close();
}
return Ok(objList);
}
}
catch (Exception ex)
{
throw ex;
}
}
Файл settlementService.ts:
deleteSettlement(id) {
console.log(id);
return this.http.delete(this.BaseURL 'Settlement/DeleteById/' id);
}
Файл Typescript:
deleteSettle(tid) {
console.log(tid); // getting tid in console
if (confirm('Are you sure to delete this record ? TID: ' tid)) {
this.settlementService.deleteSettlement(tid).subscribe(
(data: any) => {
this.toastr.success("Successfully deleted");
},
err => {
if (err.status == 400)
this.toastr.error('Server error or bad request', 'Error');
else
this.toastr.error('Failed to check data', 'Server Error');
}
);
}
}
Ошибка:
УДАЛИТЬ https://localhost:44372/api/Settlement/DeleteById/355 404
Комментарии:
1. Если у вас есть хранимая процедура, которая выполняет
DELETE
в базе данных — почему вы используетеExecuteReader
?? Это абсолютно бессмысленно — вы не ожидаете получить результирующий набор, который нужно прочитать …… просто используйтеExecuteNonQuery()
вместо этого! А также: вы должны назначить соединение сSqlCommand
объектом перед его использованием.Open()
— желательно в конструкторе2.
this.BaseURL
имеет такое же значение для других API, вызываемых из angular? Можете ли вы вызвать этот API из postman?3. В дополнение к вызову комментария
ExecuteNonQuery
marc_s вернет количество строк, на которые повлиял оператор SQL, поэтому, если вам нужно подтверждение того, что строка действительно была удалена, вы можете просто проверить, вернул ли ExecuteNonQuery положительное значение.4. @ChetanRanpariya это. baseUrl также имеет то же значение. Ошибка PostMan: 415 Неподдерживаемый тип носителя
Ответ №1:
Ваш route
путь был переопределен этим атрибутом [HttpDelete("{id}")]
Итак, просто удалите атрибут Route и добавьте свой атрибут следующим образом
[HttpDelete("DeleteById/{id}")]
Далее вам нужно удалить [FromBody]
атрибут в параметрах метода и написать так
public IActionResult DeleteSettlementById(int id)
Надеюсь, это поможет — счастливого кодирования 🙂