Удаление строки по идентификатору, не работающей в Asp.net базовый веб-API Angular 9

#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)
  

Надеюсь, это поможет — счастливого кодирования 🙂