WEB API:单个参数获取不同控制器上的方法

时间:2013-06-24 15:41:22

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

如何在ASP.Net Web API中的不同控制器上形成使用相同方法的路由?

这是我尝试过的:

  var config = new HttpSelfHostConfiguration(strUrl);
           config.Routes.MapHttpRoute(
         "Scripts", "{controller}/{Name}",
         new { controller = "Scripts",strScriptId=""});


           config.Routes.MapHttpRoute(
            "Images", "{controller}/{strParam}",
            new { controller = "Images", strImageId= "" });

感谢。

编辑:在某种意义上的方法相同......例如,在两个控制器上只接受一个不同名称的参数的方法。

示例:

  • ScriptsController具有GetScripts(string strScriptId)方法
  • ImagesController具有GetImages(字符串strImageId)方法。

我需要像

一样访问它
 1. http://localhost/GetScripts/ScriptId123
 2. http://localhost/GetImages/ImageId223

我无法弄清楚这条路线。我已经尝试了上述路线(编辑它们以使其更清晰。)

我还有更多这样的控制器,其中不同的getsomething方法只接受一个参数。

4 个答案:

答案 0 :(得分:2)

您可以只使用下面的一条路线:

config.Routes.MapHttpRoute("DefaultApi", "{controller}/{id}", new {id = RouteParameter.Optional});

您可以执行以下操作:

GetImages([FromUri(Name="id")] string strImageId);

GetScripts([FromUri(Name="id")] string strScriptId);

答案 1 :(得分:0)

请参阅this tutorial了解路由选项。

对于Id参数,这是最简单的。路由应该是:

config.Routes.MapHttpRoute(
   name: "API Default",
    routeTemplate: "api/{controller}/{id}",
   defaults: new { id = RouteParameter.Optional }
);

和控制器方法(在哪个控制器上无关紧要!):

public MyData Get(int id)
{
    ...
}

如果你真的想要Id的字符串,你可以按如下方式使用它:

public MyData Get(string id)
{
    ...
}

你真的需要一个不同的参数名称吗?
如果你这样做,你可以简单地尝试以下路由(但我不确定):

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}"
);

另请注意,您编写的路由路由在WebApis概念上是错误的:
而不是

  1. ... / GetScripts / ScriptId123
  2. ... / GetImages / ImageId223
  3. 考虑以下内容(For Get requests):

    1. ... / Scripts / 123
    2. ... /图像/ 123

答案 2 :(得分:0)

默认路线:

routes.MapHttpRoute(
            name: "default",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

应该适合你。确保您的操作方法与签名匹配(使用id而不是strImageId和strScriptId)

修改

@Josh路线中的参数应该与你动作中的参数相匹配。 正如我之前所说,没有必要创建备用路由,但如果要求在ID上保留这些名称,您可以创建一个路径来容纳它们:

routes.MapHttpRoute(
            name: "scriptsRoute",
            routeTemplate: "{controller}/{strScriptId}",
            defaults: new { controller="Scripts" }
        );

routes.MapHttpRoute(
            name: "imagesRoute",
            routeTemplate: "{controller}/{strImageId}",
            defaults: new { controller="Images" }
        );

注意在ids上方的路线中不是可选的,您可以根据需要添加约束。 @liel在命名控制器/操作方面的建议也是很好的建议。

答案 3 :(得分:0)

AS我们都知道REST是基于资源的,它使用URL标识资源,因此在REST服务中将允许不超过一个具有相同参数的方法,但是在MVC 5 Web Api方法级别路由中有解决方法

以下是您可以执行此操作的示例:

[HttpGet]
[Route("api/search/FindByName/{name}")]
FindByName(string name)
{
}

[HttpGet]
[Route("api/search/FindById/{name}")]
FindById(int searchId)

注意:“搜索”是控制器名称。

如果需要更多说明,请告知。