在MVC 6 Web Api中访问查询字符串?

时间:2015-09-23 13:33:14

标签: c# asp.net-web-api routing query-string asp.net-core-mvc

我正在尝试在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列表以进行排序,自定义过滤等的方法。

2 个答案:

答案 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