2012-10-03 59 views
2

在我的控制器UserApiController,我有以下功能:asp.net的MVC Web API相同的控制器不同的功能参数

public object GetUsers(string CountryID, string StateID) 
{ 
    //biz 
} 

public object GetPositions(int CompanyID, int DepartmentID) 
{ 
    //biz 
} 

在我的控制器SalesApiController,我有以下功能:

public object GetOrders(string CountryID, int CompanyID) 
{ 
    //biz 
} 

public object GetProducts(string CountrID, string StateID, int CompanyID) 
{ 
    //biz 
} 

在web api配置中,我可以像这样映射:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{CountryID}/{StateID}", 
    defaults: new { } 

它适用于UserApiControll er.GetUsers作为函数签名只与GetUsers匹配。

现在,问题:

1.how定义一个路由处理与相同量的参数(或者在相同或不同的控制器)

2.how不同的函数来定义一个路由来处理不同具有不同数量参数的功能(如果可能,在相同或不同控制器内)

+1

既然这是webapi,为什么要担心路由参数?为什么不使用普通的查询字符串参数? – danludwig

+0

是的,不,我们可以使用旧学校的查询字符串,但最好坚持休息,因为这是网络API的本质:) – unruledboy

回答

2

您可以创建一个像这样的属性,然后使用此属性修饰您的操作。 您仍然需要创建一条类似于您所做的匹配参数数量的路线。

public class SomeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    for(int i = 0; i <= filterContext.ActionParameters.Count; i++) 
    { 
     // i + 2 is to not consider controller and action parameters 
     filterContext.ActionParameters[filterContext.ActionParameters.ElementAt(i).Key] = 
     Convert.ChangeType(
      filterContext.Controller.ControllerContext.RouteData.Values.ElementAt(i + 2).Value, 
      filterContext.ActionDescriptor.GetParameters()[i].ParameterType 
     ); 
     } 
    } 
} 

我希望它有帮助。

+0

正如我可以从代码推断,你是动态设置参数值。但它会工作,甚至参数的名称是不一样的,就像UserApiController中的两个函数只映射一个路由? – unruledboy

+0

是的,它会的。我创建了完全相同的控制器在发布之前对其进行测试。 它也适用于SalesApiController.GetOrders操作。 –

+0

对不起,我仍然面临404错误,请问你的web api路由映射吗? – unruledboy

3

1.how以限定途径用相同量的参数(或者在相同或不同的控制器)

有几种解决方案在这里以处理不同的功能。

  • 使用多条路线。以您的UserApiController为例,很难有一条适用于2个操作的路由,它们具有不同的参数名称。我建议增加以下两条路线:

    config.Routes.MapHttpRoute(
         name: "DefaultApi-UserApiGetUsers", 
         routeTemplate: "api/{controller}/GetUsers/{CountryID}/{StateID}", 
         defaults: new { action = "GetUsers" }); 
    
        config.Routes.MapHttpRoute(
         name: "DefaultApi-UserApiGetPositions", 
         routeTemplate: "api/{controller}/GetPositions/{CompanyID}/{DepartmentID}", 
         defaults: new { action = "GetPositions" }); 
    
  • 使用查询字符串参数danludwig已建议。通过这种方式,你只需要这一个途径:??

    config.Routes.MapHttpRoute(
         name: "DefaultApiOnlyRoute", 
         routeTemplate: "api/{controller}/{action}"); 
    
    1. API/UserApi/GetUsers CountryID =美国& STATEID = WA
    2. API/UserApi/GetPositions CompanyID = 123 & DepartmentID的= 456

2。如何定义一个路由来处理具有不同量的参数不同的功能(或者内相同或不同的控制器,如果可能的话)

  • 同样,定义多个路由:

    config.Routes.MapHttpRoute(
         name: "DefaultApi-SalesApi2Params", 
         routeTemplate: "api/{controller}/{action}/{CountryID}/{CompanyID}"); 
    
        config.Routes.MapHttpRoute(
         name: "DefaultApi-SalesApi3Params", 
         routeTemplate: "api/{controller}/{action}/{CountryID}/{StateID}/{CompanyID}"); 
    
  • 使用查询字符串参数,只有一个路由 - 即上面的'DefaultApiOnlyRoute'。

    1. API/SalesApi/GetOrders?CountryID =美国& CompanyID = 123
    2. API/SalesApi /的GetProducts?CountryID =美国& STATEID = WA & CompanyID = 123

希望这帮助。

+0

嗨,关于查询字符串,我们知道它应该工作。在谈论web api路由时,我知道我们可以分别为每个动作定义路由,但是想象一下,有很多功能,我不相信我们能够承受时间。 – unruledboy

+0

有一些第三方nuget软件包,比如你可以查看的AttributeRouting。 –

相关问题