在ASP.Net WebAPI中,RouteParameter.Optional是否意味着URL的可选部分?

时间:2013-09-27 05:25:20

标签: asp.net-mvc asp.net-web-api

我有以下路由规则:

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操作:获取“api / product / 2”

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

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

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

2 个答案:

答案 0 :(得分:5)

您需要将id设为可以为空的,默认值为null

// 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下工作(当声明路由参数的可选时),但Web API更严格。

答案 1 :(得分:2)

我认为它没有按预期工作,因为你在id参数中添加了一个约束。有关相同的方案,请参阅此博文http://james.boelen.ca/programming/webapi-routes-optional-parameters-constraints/