1

在我的TestController我有以下内容:

 [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];
    }

RouteConfig映射中是:

 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 });

在浏览器中,以下请求有效:

api/test/active/1

但这会返回内部服务器错误

api/test/active

您必须做什么才能以与默认 Get 类似的方式返回可能具有或不具有参数的操作?

更新 1 正如 Cuong Le 所建议的,改变路线的顺序有帮助,路线现在是:

 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 }
        );

我必须action = ""从 ActionApi 路由中删除,否则其他控制器上的标准 Get 停止工作(即 api/values)

api/test/active 现在正在解析,但我现在得到一个 500 Internal Server Error for /api/test 是否有可能同时解析,所以 api/test 将返回“all”而 /test/active 只返回“some” ?

4

2 回答 2

0

由于您有两个名为 action 的方法,因此可能会感到困惑。尝试删除或重命名其中一个,看看是否可行。

于 2012-07-30T16:05:17.057 回答
0

一种方法是为参数提供默认值,

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

    if (id == 0) {
      return result;
    } else {
      return result[id];
    }
}
于 2012-07-30T16:08:53.420 回答