Asp.net mvc WEB API:不同控制器上的单参数get方法

Asp.net mvc WEB API:不同控制器上的单参数get方法,asp.net-mvc,asp.net-web-api,Asp.net Mvc,Asp.net Web Api,如何在ASP.NETWebAPI中的不同控制器上形成使用相同方法的路由 以下是我尝试过的: var config = new HttpSelfHostConfiguration(strUrl); config.Routes.MapHttpRoute( "Scripts", "{controller}/{Name}", new { controller = "Scripts",strScriptId=""});

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

以下是我尝试过的:

  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(字符串strScriptId)方法
  • ImagesController具有GetImages(字符串strImageId)方法
我需要像这样访问它

 1. http://localhost/GetScripts/ScriptId123
 2. http://localhost/GetImages/ImageId223
我不知道这条路怎么走。我已经尝试了上述路线(编辑它们以使其更清晰。)

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

有关路由选项,请参阅

对于
Id
参数,它是最简单的。路线应为:

config.Routes.MapHttpRoute(
   name: "API Default",
    routeTemplate: "api/{controller}/{id}",
   defaults: new { id = RouteParameter.Optional }
);
控制器方法(在哪个控制器上不重要!):

如果您确实需要Id的字符串,可以按如下方式使用它:

public MyData Get(string id)
{
    ...
}
您真的需要为参数指定不同的名称吗
如果您这样做,您可以简单地尝试以下路由(但我不确定):

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

  • …/GetScripts/ScriptId123
  • …/GetImages/ImageId223
  • 考虑以下内容(对于Get请求):

  • …/Scripts/123
  • …/Images/123

  • 您可以只选择一条路线,如下所示:

    config.Routes.MapHttpRoute("DefaultApi", "{controller}/{id}", new {id = RouteParameter.Optional});
    
    GetImages([FromUri(Name="id")] string strImageId);
    
    GetScripts([FromUri(Name="id")] string strScriptId);
    
    你可以采取如下行动:

    config.Routes.MapHttpRoute("DefaultApi", "{controller}/{id}", new {id = RouteParameter.Optional});
    
    GetImages([FromUri(Name="id")] string strImageId);
    
    GetScripts([FromUri(Name="id")] string strScriptId);
    
    默认路线:

    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" }
            );
    
    注意在ID上方的路线中,ID不是可选的,如果需要,可以添加约束。
    @liel在命名控制器/操作方面的建议也是很好的建议。

    我们都知道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)
    
    注意:“搜索”是控制器名称


    如果需要更多澄清,请告知

    “在不同的控制器上使用相同的方法”是什么意思?请看我的编辑。谢谢,我知道这一点。我已经在使用HttpGet了。我需要将URL路由到在不同控制器中接受单个参数的方法。参数的名称不总是Id。它可能是ImageId、ScriptId等。它们是字符串。我不知道你所说的概念错误是什么意思。这是应用程序的要求。所以,我没有使用api/你试过我在回答的最后一段代码中写的路线吗?(无身份证)