2017-07-25 42 views
0

我想在我的控制器中有两个Web API方法。其中一个用于在标题中使用MyViewModel对象调用GET,另一个则不使用。GET和无参数GET导致AmbiguousActionException?

MyController.cs:

[Produces("application/json")] 
[Route("api/[controller]")] 
public class MyController : Controller 
{ 
    [HttpGet] 
    public IEnumerable<UserModel> Get() 
    { 
     // ... 
    } 

    [HttpGet] 
    public IEnumerable<UserModel> Get(MyViewModel viewModel) 
    { 
     // ... 
    } 
} 

但浏览到Chrome中的路由地址不传递任何MyViewModel给了我这个错误:

AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:

MyController.Get (MyProject)

MyController.Get (MyProject)

如果我注释掉的参数方法,把一个破发指向参数化函数并浏览到api URL,它看起来像是viewModelnull就像我预料的那样,它似乎是一个新的MyViewModel对象用参数1 ess构造函数。似乎它可能与我的问题有关。

我对Microsoft.AspNetCore V1.1.2Microsoft.AspNetCore.Mvc V1.1.3运行。

回答

2

将属性路由添加到其中的一个。 例如:

[HttpGet("/myaction")] 
    public IEnumerable<UserModel> Get(MyViewModel viewModel) 
    { 
    // ... 
    } 

或将其添加到所有的人。 MVC无法区分两种方法,因为viewModel可能为空,并且不知道它是否应该先匹配action或其他。

1

One for when GET is called with a MyViewModel object in the header, and one without.

在ASP.NET核心Model Binding默认使用的查询参数为源模型的人口,而不是头。如果您需要从头部填补MyViewModel,使用[FromHeader]属性:

public IEnumerable<UserModel> Get([FromHeader] MyViewModel viewModel) 

ASP.NET核心routing实现不使用标头路由解决。正如您使用属性路由,正如@Vlado所说的,您需要使用不同的路由名称来消除歧义行为。