我试图在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()
而不是属性路由。它可以给你更多的自由定义路线。