проблема с HttpPut из Ангулара
Имеется: 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>
Ответы (1 шт):
Кажется, проблема может быть связана с тем, что вы передаете параметр 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 для обновления статуса задачи.