我在项目中设置了各种API,并且大多数API都在工作。但是,我正在努力使DELETE
API可以在.aspx页面中的按钮单击上工作。
我有DELETE
api的以下代码,包括我创建的属性路由:
public class ReviewController : ApiController
{
private ReviewAPIModel db = new ReviewAPIModel();
[Route("api/Review/delete/{id}")]
[HttpDelete]
[ResponseType(typeof(review))]
public IHttpActionResult Deletereview(int id)
{
review review = db.review.Find(id);
if (review == null)
{
return NotFound();
}
db.review.Remove(review);
db.SaveChanges();
return Ok(review);
}
}
我确定属性路由已正确启用。
我的按钮单击具有以下代码:
protected void repReviews_ItemCommand(object source, RepeaterCommandEventArgs e)
{
if (e.CommandName == "Delete")
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:#####/api/review/delete");
var deleteTask = client.DeleteAsync(Convert.ToString(e.CommandArgument));
deleteTask.Wait();
var result = deleteTask.Result;
if (result.IsSuccessStatusCode)
{
Response.Redirect("MyReviews.aspx");
}
Response.Redirect("MyReviews.aspx");
}
}
}
当我尝试通过单击按钮来运行代码时,它将全部运行(我使用断点进行了检查)。但是,该记录不会从数据库中删除,而是仍在屏幕上。
我为这种情况找到的所有指导都是A)使用SQL数据源,或B)不使用属性路由(A)是寻找有用的Google结果的主要问题)。
如何使这两件事相互啮合?
ETA:数据库上下文:
public partial class ReviewAPIModel : DbContext
{
public ReviewAPIModel()
: base("name=ReviewAPIModel")
{
}
public virtual DbSet<review> review { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
答案 0 :(得分:1)
从注释看来,问题似乎不在于数据库没有删除该项目。这是因为即使您在操作上具有[HttpDelete]
属性,Web服务器仍未接受请求的HTTP Verb(删除)(不允许使用HTTP 405方法)。
我的建议是在操作中包含[AcceptVerbs]
属性。
[Route("api/Review/delete/{id:int}")]
[HttpDelete]
[AcceptVerbs("DELETE")] //<-- ADD THIS
[ResponseType(typeof(review))]
public IHttpActionResult Deletereview(int id) {
review review = db.review.Find(id);
if (review == null) {
return NotFound();
}
db.review.Remove(review);
db.SaveChanges();
return Ok(review);
}