2015-09-23 5 views
3

Я пытаюсь добавить функцию Get() в MVC 6 (Asp. Net 5) Web Api, чтобы передать параметр конфигурации в виде строки запроса. Вот эти две функции, которые у меня уже есть:Доступ к строке запроса в MVC 6 Web Api?

[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 свет на документации. Мне действительно нужен способ передать некоторые параметры конфигурации в список проектов для сортировки, пользовательской фильтрации и т. Д.

+2

Вы попробовали атрибут [FromUri] вместо [FromQuery]? в вашем последнем методе. – Prashant

+1

[FromUri] - это не вариант. Единственными параметрами являются From + [Body, Form, Header, Query, Route, Services]. – bootRom

+0

bootRom и @Prashant верны - это изменилось с MVC5 на MVC6. Это была моя проблема. – CrazyPyro

ответ

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() вместо маршрутизации атрибута. Это может дать вам больше свободы, определяя маршруты.

+0

Да, это работает. Я также наткнулся на ответ методом проб и ошибок, но я не понимал, почему это сработало. Я согласен с использованием 'IRouteBuilder.MapRoute()' более чистого решения. – bootRom

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.