You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Web API DELETE请求触发Get方法报错:参数'id'传入null

解决ASP.NET Web API DELETE请求匹配到Get方法的错误

这个问题我之前也碰到过,本质是你的DELETE请求被错误路由到了Get(Int32)方法上,框架试图调用这个需要非空int参数的方法,但请求里没有传入有效的id值,所以抛出了这个参数为null的错误。下面一步步排查解决:

1. 检查控制器的Delete方法定义

首先确保你的TransactionController里的删除方法正确标记了HTTP动词,Web API需要明确识别哪个方法对应DELETE请求:

public class TransactionController : ApiController
{
    // 正确的Delete方法:要么加[HttpDelete]特性,要么方法名以Delete开头
    [HttpDelete]
    public IHttpActionResult Delete(int id)
    {
        // 这里写你的删除逻辑,比如删除数据库记录
        if (删除成功)
        {
            return Ok("记录已删除");
        }
        return NotFound();
    }

    // 你的Get方法(报错里提到的那个)
    public string Get(int id)
    {
        // ... 原有的Get逻辑
    }
}

注意:如果方法名是DeleteXXX格式,Web API会自动识别为DELETE请求,但加上[HttpDelete]特性更明确,避免命名约定带来的歧义。

2. 验证jQuery AJAX请求的正确性

确保你的AJAX请求确实是DELETE类型,并且正确传递了id参数:

var transactionId = 123; // 这里要确保这个变量有有效的数值,不是null/undefined
$.ajax({
    url: '/api/Transaction/' + transactionId, // 必须包含id,比如/api/Transaction/123
    type: 'DELETE', // 这里一定要写DELETE,不能写错成GET/POST
    contentType: 'application/json',
    success: function(response) {
        console.log("删除成功:", response);
    },
    error: function(xhr, status, err) {
        console.error("删除失败:", err);
    }
});

如果transactionId是null,请求URL会变成/api/Transaction/,这时候路由找不到匹配的Delete方法,就会尝试匹配Get方法,而Get方法要求非空的id,所以就会报错。

3. 检查Global.asax的Web API路由配置

Web API的路由规则决定了请求如何匹配到控制器方法,默认的路由配置应该是这样的:

protected void Application_Start()
{
    // 注册Web API路由
    RouteTable.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

这个默认路由会根据HTTP动词匹配对应的方法:

  • DELETE请求api/Transaction/123会匹配Delete(int id)方法
  • GET请求api/Transaction/123会匹配Get(int id)方法

如果你的路由配置有自定义规则,要确保没有把DELETE请求错误导向到Get方法,比如不要在路由里硬指定action为Get,或者路由顺序不对(更具体的路由要放在默认路由前面)。

如果需要更严格的路由约束,可以专门为DELETE请求添加路由:

RouteTable.Routes.MapHttpRoute(
    name: "DeleteTransaction",
    routeTemplate: "api/Transaction/{id}",
    defaults: new { controller = "Transaction", action = "Delete" },
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Delete) }
);

// 默认路由放在后面
RouteTable.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

最后验证

用Fiddler重新发送DELETE请求,确保:

  • 请求方法是DELETE
  • 请求URL包含有效的id(比如http://localhost:xxxx/api/Transaction/123)
  • 响应状态码是200(成功)或者404(记录不存在),而不是之前的错误

内容的提问来源于stack exchange,提问作者Marcos Foster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:08:54