4

我有以下路由规则:

config.Routes.MapHttpRoute(
                name:          "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults:      new { id = RouteParameter.Optional },
                constraints:   new { id = @"\d+"}
            );

以及具有以下操作的 ProductController:

public Product Get(int id)
{
    return _svc.GetProduct(id);
}

public int Post(Product p)
{
   return 0;            
}

我可以Get按预期调用操作:GET "api/product/2"

我以为我可以这样调用我的Post操作:POST“api/product” ,但它不起作用。我收到 404 错误。如果我这样做,它会起作用:POST "api/product/2"

我认为通过设置 id 的默认值RouteParameter.Optional意味着不需要存在 url 的 {id} 部分来匹配路由规则。但这似乎没有发生。是制定另一个没有 {id} 部分到 URL 的规则的唯一方法吗?

我有点困惑。谢谢你的帮助。

4

2 回答 2

5

您需要使用默认值为 nullid的可空 int

// doesn't work
public Product Get(int? id)
{
    return _svc.GetProduct(id);
}

// works
public Product Get(int? id = null)
{
    return _svc.GetProduct(id);
}

我大约有 95% 的把握这两个都在 MVC 下工作(当为 route 参数声明 Optional 时),但 Web API 更严格。

于 2014-08-12T02:24:56.630 回答
1

我认为它没有按预期工作,因为您正在向 id 参数添加约束。有关相同场景,请参阅此博客文章http://james.boelen.ca/programming/webapi-routes-optional-parameters-constraints/

更新:看起来好像原始链接已死,但返回机器的方式已经覆盖了我们: https ://web.archive.org/web/20160228013349/http://james.boelen.ca/programming/webapi-routes-可选参数约束/

于 2013-09-27T05:49:12.040 回答