MVC Web Api Route with default action not working

2019-08-15 07:45发布

In my TestController I have the following:

 [HttpGet]
    public IEnumerable<String> Active()
    {
        var result = new List<string> { "active1", "active2" };

        return result;
    }

    [HttpGet]
    public String Active(int id)
    {
        var result = new List<string> { "active1", "active2" };

        return result[id];
    }

In RouteConfig the mapping is:

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

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

In a browser the following request works:

api/test/active/1

But this returns a Internal Server Error:

api/test/active

What do you have to do to return a action that may or maynot have a parameter in a similar manner to the default Get?

Update 1 As Cuong Le suggested, changing the ordering of routes helped, the routes are now:

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

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

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

I had to remove action = "" from the ActionApi route otherwise the standard Get on the other controllers stopped working (i.e. api/values)

api/test/active is now resolving, but I now get a 500 Internal Server Error for /api/test is it possile to have both resolves, so api/test would return "all" and /test/active only return "some"?

2条回答
我只想做你的唯一
2楼-- · 2019-08-15 07:51

It is probably getting confused since you have two methods named action. Try deleting or renaming one of them and see if that works.

查看更多
Root(大扎)
3楼-- · 2019-08-15 08:14

One way to do it is to provide a default value for the parameter,

[HttpGet]
public String Active(int id = 0)
{
    var result = new List<string> { "active1", "active2" };

    if (id == 0) {
      return result;
    } else {
      return result[id];
    }
}
查看更多
登录 后发表回答