Web API DELETE - 参数字典包含参数' id'的空条目。

时间:2018-02-13 17:14:32

标签: c# asp.net asp.net-web-api

我尝试使用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

的Http路由
 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中的断点,但显然没用!

我知道这有点吝啬(这个项目只是个人自学的网页开发),请接受我对我明显缺乏理解的道歉!

1 个答案:

答案 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 thatordering of the registration code is important!