我定义了这两条路线:
routes.MapRoute(
name: "GetVoucherTypesForPartner",
url: "api/Partner/{partnerId}/VoucherType",
defaults: new { controller = "Partner", action = "GetVoucherTypesForPartner"}
);
routes.MapRoute(
name: "Default",
url: "api/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional}
);
在我的PartnerProfile
控制器中,我有两种方法:
public Partner Get(string id)
{ }
public IEnumerable<string> GetVoucherTypesForPartner(string id)
{ }
如果我点击了网址~/api/Partner/1234
,则会按预期调用Get
方法。
但是,如果我点击了网址~/api/Partner/1234/VoucherType
,则会调用相同的Get
方法。我期待我的GetVoucherTypesForPartner
被调用。
我很确定路线设置中的某些内容是错误的......
答案 0 :(得分:2)
您似乎已映射标准MVC路由,而不是Web API路由。有很大的不同。标准路由由派生自Controller
类的控制器使用,但如果您使用ASP.NET Web API并且控制器派生自ApiController
类型,那么您应该定义HTTP路由。
您应该在~/App_Start/WebApiConfig.cs
而不是~/App_Start/RouteConfig.cs
内填写。
所以继续:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "GetVoucherTypesForPartner",
routeTemplate: "api/Partner/{partnerId}/VoucherType",
defaults: new { controller = "Partner", action = "GetVoucherTypesForPartner" }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
然后:
public class PartnerController : ApiController
{
public Partner Get(string id)
{
...
}
public IEnumerable<string> GetVoucherTypesForPartner(string partnerId)
{
...
}
}
需要注意的事项:
GetVoucherTypesForPartner
操作所采用的参数称为partnerId
而不是id
,以便尊重您的路线定义并避免任何混淆