2012-07-30 61 views
1

在我TestController我有以下几点:MVC网页API路由的默认动作不灵

[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 

那你必须做返回动作可能或maynot有一个参数,以类似的方式为默认获取?

更新1 作为的Cuong乐建议,改变路线的顺序的帮助下,该航线目前有:

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

我不得不从ActionApi路线删除action = ""否则标准获取的其他控制器停止工作(即api /值)

api/test/active现在正在解决,但我现在得到一个500内部服务器错误的/ api /测试是可以解决,所以API /测试将返回“所有“和/测试/主动只返回”一些“?

+0

你会得到什么样的内部服务器错误的?多个行动被发现? – 2012-07-30 16:40:00

+0

对不起,我不确定如何获取更详细的消息,我正在运行只是在Visual Studio中使用调试,是否有一个web.config设置或什么可以得到一个更详细的错误? – HadleyHope 2012-07-30 17:17:00

+0

我还没有尝试调试BU我认为你可以看到调试的详细错误。您也可以在web.config上设置并使用过滤器查看抛出的错误。至于你的问题,我到目前为止还没有明确的答案:(。 – 2012-07-31 11:14:27

回答

0

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

+0

)如果我在控制器中注释掉Active(int id),我得到一个400的错误请求api/test/active。我会想到两种方法一使用一个没有参数的函数就可以,因为默认的例子Get()和Get(int id)工作。 – HadleyHope 2012-07-30 16:44:01

0

一种方式来做到这一点是提供参数的默认值,

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

    if (id == 0) { 
     return result; 
    } else { 
     return result[id]; 
    } 
} 
+0

Darrel,返回类型将不同,如果id == 0 Enumerable将被返回。是将“操作”添加到Url时的路由。 – HadleyHope 2012-07-30 16:47:01