2017-03-20 18 views
0

下面的代码Dotnet核心无法区分名称相同但参数不同的动作?

public class OrderController : Controller 
{ 
    // GET api/values 
    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" }; 
    } 

    // GET api/values/5 
    public string Get(int id) 
    { 
     return "value"; 
    } 
} 

它可以在ASP.NET 4.5运行良好,但它不会对DOTNET核心1.1 .The错误讯息话题工作:

失败:Microsoft.AspNetCore.Mvc .Internal.ActionSelector [1] 请求匹配多个操作导致歧义。匹配操作:WebAPI.Controllers.OrderController.Get(的WebAPI) WebAPI.Controllers.OrderController.Get(的WebAPI)

失败:Microsoft.AspNetCore.Server.Kestrel [13] 连接ID “0HL3F88N44HR6”:未处理的异常被应用程序抛出。 Microsoft.AspNetCore.Mvc.Internal.AmbiguousActionException:匹配多个操作。以下动作匹配的路由数据,并已全部约束满足: WebAPI.Controllers.OrderController.Get(的WebAPI) WebAPI.Controllers.OrderController.Get(的WebAPI)

回答

0

尝试这样的:

// GET api/values/5 
[HttpGet("Get/{id}"] 
public string Get(int id) 
{ 
    return "value"; 
} 
0

您可以通过像这样添加HttpGet属性来解决此问题。

[HttpGet("{id}")] 
// GET api/values/5 
public string Get(int id) 
{ 
    return "value"; 
} 

这是因为在ASP.NET 5,对于Web API路由,使用Routes.MapHttpRoute方法和ASP.NET MVC Routes.MapRoute方法。在ASP.NET Core中,使用Routes.MapRoute方法。

1

这不是Asp.Net.Core的问题,确切的说,在MVC4和MVC5中都有相同的行为。

ASP.NET MVC不支持方法重载,有很多关于这个做题和文章:

可能有一组解决方案来获得所需的行为,其中之一是:

首先 - 使用内置属性,派生自MVC4中的ActionFilterAttributeActionMethodSelectorAttribute(它是在处理请求时检索所需操作的基类)。例如ActionNameAttributeHttpGetAttributeHttpPostAttribute等:

public IEnumerable<string> Get() 
{ 
    return new string[] { "value1", "value2" }; 
} 

[ActionName("GetById") 
public string Get(int id) 
{ 
    return "value"; 
} 

或者只需重命名你的方法。

另一种解决方案是创建自己的属性,如ActionFilterAttribute所示,如第二个链接所示。

当我面对这个问题,我解决了这个通过传递一个可空参数以下列方式:

public object Get(int? id) 
{ 
    if (id == null) 
     return new string[] { "value1", "value2" }; 

    var passedId = (int) id; 
    return GetValueByPassedId(passedId); 
} 
+0

谢谢。但为什么它可以在ASP.NET 4.5 –

+0

工作得很好,也不会在ASP.NET 4.5做工精细,检查相关链接,这里所描述的同样的问题在不同版本的ASP.NET –

+0

的它的演示代码,在Visual Studio生成。 ORZ –

相关问题