проблема с HttpPut из Ангулара

Рейтинг: 0Ответов: 1Опубликовано: 11.04.2023

Имеется: Asp.Net Web API нужно из Ангулар использовать Get, Post,Put, операции первые две сделал но c Put НЕ получается (данные не меняются),хотя из Swager-a все хорошо работает... пробовал разные варранты, в некоторых случаях в Консоли (Ф12) показывало что якобы все хорошо код 200, и зелёный, но на деле в базе нечего не менялось.

updateStatus(iD:number) {
this.http.put(`https://localhost:7242/api/ToDo/UpdateStatus/?id=${iD}`, {status: true})
.subscribe(
  response => {
    console.log(response); // handle response from API
  },
);

}

        [HttpPut]
    public ActionResult UpdateStatus(int id)
    {
        string connectionString = "Server=.;DataBase=ToDoDb;Trusted_Connection=True;MultipleActiveResultSets=true;Encrypt=False";
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();
        SqlCommand command = new SqlCommand();
        command.Connection = connection;
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "UpdateToDo";
        try
        {
            command.Parameters.Add("Id", SqlDbType.Int).Value = id;
            command.ExecuteNonQuery();
            connection.Close();
        }
        catch (Exception ex)
        {

            throw new Exception("Error while Update ToDO Status");
        }
        return Ok();
    }

Html Template:

  <tbody>
  <tr *ngFor="let t of taskArray; let i = index">
    <td scope="row">{{i+1}}</td>
    <td>{{t.desc}}</td>
    <td>
      <input type="checkbox" id="doneCheckBox-{{i}}"  (click)="updateStatus(i)">
    </td>
  </tr>
</tbody>

Ответы

▲ 0

Кажется, проблема может быть связана с тем, что вы передаете параметр status в теле запроса PUT, но в методе UpdateStatus серверного кода вы не используете этот параметр. Вместо этого вы просто вызываете хранимую процедуру UpdateToDo с одним параметром Id. Чтобы исправить эту проблему, вы можете передать параметр status в хранимую процедуру.

Измените метод UpdateStatus в API-контроллере:

[HttpPut]
public ActionResult UpdateStatus(int id, [FromBody] UpdateStatusRequest request)
{
    string connectionString = "Server=.;DataBase=ToDoDb;Trusted_Connection=True;MultipleActiveResultSets=true;Encrypt=False";
    SqlConnection connection = new SqlConnection(connectionString);
    connection.Open();
    SqlCommand command = new SqlCommand();
    command.Connection = connection;
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "UpdateToDo";
    try
    {
        command.Parameters.Add("Id", SqlDbType.Int).Value = id;
        command.Parameters.Add("Status", SqlDbType.Bit).Value = request.Status;
        command.ExecuteNonQuery();
        connection.Close();
    }
    catch (Exception ex)
    {
        throw new Exception("Error while Update ToDO Status");
    }
    return Ok();
}

public class UpdateStatusRequest
{
    public bool Status { get; set; }
}

Измените функцию updateStatus в Angular:

updateStatus(iD: number, isChecked: boolean) {
  this.http.put(`https://localhost:7242/api/ToDo/UpdateStatus/?id=${iD}`, { status: isChecked })
    .subscribe(
      response => {
        console.log(response); // handle response from API
      },
    );
}

Измените шаблон HTML:

<input type="checkbox" id="doneCheckBox-{{i}}"  (click)="updateStatus(t.id, $event.target.checked)">

Теперь параметр status должен передаваться в хранимую процедуру UpdateToDo и обновлять статус задачи в базе данных. Убедитесь, что ваша хранимая процедура UpdateToDo также использует параметр Status для обновления статуса задачи.