Dotnet核心无法区分具有相同名称但不同参数的动作?

时间:2017-03-20 03:59:03

标签: c# asp.net-mvc asp.net-core-mvc

以下代码

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。错误消息:

  

失败: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)

3 个答案:

答案 0 :(得分:1)

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

ASP.NET MVC不支持方法重载,有很多关于此的SO问题和文章:

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

首先 - 使用内置属性,该属性派生自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);
}

答案 1 :(得分:0)

试试这样:

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

答案 2 :(得分: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方法。