我尝试使用ASP.NET Web API DELETE从数据库中删除记录。
这是jQuery AJAX调用:
var row = $(dom).closest("tr");
var text = row.find(".tId").text();
var tId = +(text);
//HTTP DELETE method
$.ajax({
url: 'api/transaction/delete',
type: 'DELETE',
data: {
'id': tId
},
success: function (result) {
//Success logic
//Refresh table?
console.log("Successfully deleted transaction " + tId);
},
error: function () {
console.log("Error deleting transaction");
}
});
这是控制器代码:
[HttpDelete]
[Route("api/transaction/delete/{id}")]
public HttpResponseMessage Delete(int id)
{
if (DataLayer.DataLayer.DeleteTransaction(id))
{
return Request.CreateResponse(HttpStatusCode.OK);
}
else
{
return null;
}
}
来自Global.asax.cs
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
查看Fiddler中的请求,返回的错误为The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.String Get(Int32)' in 'SemanticUI_Playground.Controllers.TransactionController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
但奇怪的是 - 在Fiddler中 - 我可以看到请求有id=1045
。
我显然没有做正确的事;我的猜测是路由。如果我将AJAX请求网址更改为api/transaction
而不是api/transaction/delete
,我会收到不同的错误(DELETE is not supported
或类似的效果)。
完全删除id
参数意味着符合TransactionController
中的断点,但显然没用!
我知道这有点吝啬(这个项目只是个人自学的网页开发),请接受我对我明显缺乏理解的道歉!
答案 0 :(得分:2)
添加不同类型的请求的好处是您不需要多个URL来执行操作;你通过请求类型(DELETE,GET,POST等)调用它们。我在您给出的示例中要做的是删除您使用[Route("api/transaction/delete/{id}")]
声明的其他路由并使用以下方法调用它:
$.ajax({
url: '/api/transaction/' + tId,
type: 'DELETE',
success: function (result) {
//Success logic
//Refresh table?
console.log("Successfully deleted transaction " + tId);
},
error: function () {
console.log("Error deleting transaction");
}
});
或者类似地保留代码路由并将请求发送到'/api/transaction/delete/' + tId
。
我发现您还需要在RouteTable.Routes.MapHttpAttributeRoutes
来电前Global.asax.cs
中使用MapHttpRoute
注册属性路由。请查看for a bit of guidance on that(ordering of the registration code is important!)