我试图在MVC6(ASP.NET5)Web API中添加get()函数,以将配置选项作为查询字符串传递。下面是我已经拥有的两个功能:

[HttpGet]
public IEnumerable<Project> GetAll()
{
    //This is called by http://localhost:53700/api/Project
}

[HttpGet("{id}")]
public Project Get(int id)
{
    //This is called by http://localhost:53700/api/Project/4
}

[HttpGet()]
public dynamic Get([FromQuery] string withUser)
{
    //This doesn't work with http://localhost:53700/api/Project?withUser=true
    //Call routes to first function 'public IEnumerable<Project> GetAll()
}

我已经尝试了几种不同的方法来配置路由,但是mvc 6在文档中很简单。我真正需要的是一种将一些配置选项传递到项目列表以进行排序、自定义筛选等的方法。

最佳答案

在一个控制器中不能有两个[HttpGet]具有相同的template。我使用的是asp.net5-beta7,在我的例子中,它甚至抛出了以下异常:
Microsoft.aspnet.mvc.AmbiguoUsactionException异常
多个操作匹配。以下操作匹配路由数据并满足所有约束:
原因是[From*]属性是用于绑定而不是路由的。
以下代码应适用于您:

    [HttpGet]
    public dynamic Get([FromQuery] string withUser)
    {
        if (string.IsNullOrEmpty(withUser))
        {
            return new string[] { "project1", "project2" };
        }
        else
        {
            return "hello " + withUser;
        }
    }

还可以考虑使用Microsoft.AspNet.Routing.IRouteBuilder.MapRoute()而不是属性路由。它可以给你更多的自由定义路线。

10-08 15:56