在控制器中执行操作的自定义路径

时间:2013-03-26 15:38:48

标签: c# asp.net-mvc-4 asp.net-web-api

RouteConfig我有:

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  routes.MapRoute("ApiController", "api/{controller}");

  routes.MapRoute("ApiControllerAndIntegerId", "api/{controller}/{id}", null, new { id = @"^\d+$" });

  routes.MapRoute("ApiControllerActions", "api/{controller}/{action}");
}

然后我有一个LookupController

public class LookupsController : ApiController
{
  public string Get()
  {
    return "Default Get";
  }
  // /api/lookups/custom
  [ActionName("custom")]
  public string CustomLookup()
  {
    return "Hello, World";
  }
}

如果我导航到/api/lookups/custom,我仍然会Default Get而不是Hello, World。我做错了什么?

修改

我尝试了MapHttpRouteMapRoute的不同变体。似乎都没有用。

2 个答案:

答案 0 :(得分:2)

按照您定义的顺序检查MVC路由。你遇到/api/lookups/custom时会遇到问题,"api/{controller}/{action}"应该点击"api/{controller}/{id}"。但是,在此之前您有"api/{controller}"{id},所以看起来其中一个正在抓住它。我的猜测是,它试图在这两个中的第一个中将“自定义”解析为{{1}}。我注意到你没有在你的路线中指定默认控制器或动作;你有可能在发布之前将它们拿出来占用更少的空间,但是如果你没有指定默认值我建议你这样做 - 无论它是否能够选择它自己的默认值,它对知道你的节目“我不知道该做什么”的行为是什么。

撤消你指定这三条路线的顺序。如果有疑问,请将最长和最具体的路线放在最前面,然后逐渐变得模糊。将更多通用路线放在最顶层往往会导致这些路线捕捉到应该进一步降低更具体路线定义的东西。

答案 1 :(得分:1)

您使用错误的配置路由进行Web Api,它应该是MapHttpRoute而不是MapRoute

var configuration = GlobalConfiguration.Configuration;

     configuration.Routes.MapHttpRoute(
          name: "CustomizedApi",
          routeTemplate: "api/{controller}/{action}/{id}",
          defaults: new { id = RouteParameter.Optional }
      );

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

请注意:将路线"api/{controller}/{action}/{id}"置于"api/{controller}/{id}"

之上

另外,在[HttpGet]中标记CustomLookup以支持此操作的GET方法:

// /api/lookups/get
public string Get()
{
    return "Default Get";
}

// /api/lookups/custom
[ActionName("custom")]
[HttpGet]
public string CustomLookup()
{
    return "Hello, World";
}

它会起作用