我正在尝试在MVC 6(Asp .Net 5)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对文档很轻松。我真正需要的是一种将一些配置选项传递到Projects列表以进行排序,自定义过滤等的方法。
答案 0 :(得分:4)
在单个控制器中,您不能拥有两个[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()
代替属性路由。它可以让您更自由地定义路线。
答案 1 :(得分:0)
使用RESTful路由约定(默认情况下由ASP.NET 5 / MVC 6强制执行)或定义自定义路由非常有用,如this answer中所述。
以下是使用自定义基于属性的路由的快速示例:
[HttpGet("GetLatestItems/{num}")]
public IEnumerable<string> GetLatestItems(int num)
{
return new string[] { "test", "test2" };
}
有关自定义路由的详细信息,请在我的博客上阅读the following article。