3

如何在 Asp.Net Web API 中要求某些路由的查询字符串?

控制器:

public class AppleController : ApiController
{
    public string Get() { return "hello"; }
    public string GetString(string x) { return "hello " + x; }
}

public class BananaController : ApiController
{
    public string Get() { return "goodbye"; }
    public string GetInt(int y) { return "goodbye number " + y; }
}

想要的路线:

/apple        --> AppleController  --> Get()
/apple?x=foo  --> AppleController  --> Get(x)
/banana       --> BananaController --> Get()
/banana?y=123 --> BananaController --> Get(y)
4

3 回答 3

3

只需执行以下操作:

public string Get(int y = -1)
{ 
    if(y < 0) return "goodbye"; 
    return "goodbye number " + y; 
}

这样,它是一条路线,涵盖所有情况。为了清楚起见,您也可以将每个方法都考虑为私有方法。

另一种方法是添加更多路线,但由于这些路线有些具体,因此您必须添加额外路线。为简单起见,我会说您将方法更改GetStringGetInt相同的东西(例如GetFromId,您可以重用路由:

routes.MapRoute(
    name: "GetFromIdRoutes",
    url: "{controller}/{id}",
    defaults: new { action = "GetFromId" }
);

routes.MapRoute(
    name: "GetRoutes",
    url: "{controller}",
    defaults: new { action = "Get" }
);

如果你没有使这些足够通用,你最终可能会得到很多路由条目。另一个想法是将这些放入区域以避免路线冲突。

于 2012-09-12T19:15:47.677 回答
0

您可以在路由中将查询字符串指定为可选或非(在 Global.asax 中):

    ' MapRoute takes the following parameters, in order:
    ' (1) Pages
    ' (2) ID of page
    ' (3) Title of page
    routes.MapRoute( _
        "Pages", _
        "Pages/{id}/{title}", _
        New With {.controller = "Home", .action = "Pages", .id = UrlParameter.Optional, .title = UrlParameter.Optional} _
    )

这是 VB.NET。

于 2012-09-12T19:15:11.173 回答
0

今天早上我有一个类似的问题,我想我找到了一种更简单的方法来配置我的路线。在你的情况下,使用这个:

config.Routes.MapHttpRoute(
    name: "AppleRoute",
    routeTemplate: "apple",
    defaults: new { controller = "Apple" }
);

config.Routes.MapHttpRoute(
    name: "BananaRoute",
    routeTemplate: "banana",
    defaults: new { controller = "Banana" }
);

只需指定控制器,并让框架根据您的查询字符串参数是否存在来选择正确的操作。

于 2013-02-07T08:20:06.230 回答