ASP.NET Web Api路由无法捕获参数

时间:2012-04-15 09:55:01

标签: rest routes asp.net-mvc-routing asp.net-web-api input-parameters

我在global.asax.cs文件中设置了一些路由,如下所示:

routes.MapHttpRoute(
            name: "ColorsRoute",
            routeTemplate: "api/{controller}/{action}/{styleId}",
            defaults: new
            {
                controller = "Cars",
                action = "Colors"
            }
        );

控制器:

    public Dictionary<string, string> Colors(string styleid)
    {
        //returns a dictionary of colors and ids
    }

事情是使用这样的网址:

localhost:58645/api/cars/colors/18752867

没有拿起styleId,但它的传统使用方式如下:

localhost:58645/api/cars/colors?styleid=18752867

关于为什么会发生这种情况的任何想法?

更新:

这些路由可以正常使用“domain.com/api/cars/makes/new”这样的调用:

        routes.MapHttpRoute(
            name: "MakesRoute",
            routeTemplate: "api/{controller}/{action}/{state}",
            defaults: new
            {
                controller = "Cars",
                action = "Makes"
            }
        );

控制器:

    public Dictionary<string, string> Makes(string state)       
    {
        //return dictionary of makes and ids
    }

以下是我的其他路线:

        routes.MapHttpRoute(
            name: "ModelsRoute",
            routeTemplate: "api/{controller}/{action}/{make}/{state}",
            defaults: new
            {
                controller = "Cars",
                action = "Models"
            }
        );

        routes.MapHttpRoute(
            name: "YearsRoute",
            routeTemplate: "api/{controller}/{action}/{modelId}/{state}",
            defaults: new {
                controller = "Cars",
                action = "Years"
            }
        );

        routes.MapHttpRoute(
            name: "StylesRoute",
            routeTemplate: "api/{controller}/{action}/{make}/{model}/{year}",
            defaults: new {
                controller = "Cars",
                action = "Styles"
            }
        );

1 个答案:

答案 0 :(得分:4)

根据您定义路由的顺序,匹配的路由可能不是您希望将请求发送到的路由。特别是您的YearsRoute和ModelsRoute。您具有相同数量的段,但没有指定任何路由约束。

尝试将MapHttpRoute作为您的第一个注册路由,并添加正则表达式约束

routes.MapHttpRoute(
        name: "ColorsRoute",
        routeTemplate: "api/{controller}/{action}/{styleId}",
        defaults: new
        {
            controller = "Cars",
            action = "Colors"
        },
      constraints: new { styleId = @"\d+" }
    );

查看它现在是否匹配。

<强>更新
另一种选择是为您的URI定义一个直接映射到您想要使用的ApiController和Action方法的路由。这种方式请求总是转到你想要的行动