2017-01-10 5 views
22

Я строю один RESTful API с использованием ASP.NET Core MVC, и я хочу использовать параметры запроса для указания фильтрации и подкачки на ресурсе, который возвращает коллекцию.Как читать значения из строки запроса с помощью ASP.NET Core?

В этом случае мне нужно прочитать значения, переданные в строке запроса, для фильтрации и выбора результатов для возврата.

Я уже выяснил, что внутри контроллера Get действие, получающее доступ к HttpContext.Request.Query, возвращает IQueryCollection.

Проблема в том, что я не знаю, как она используется для извлечения значений. По правде говоря, я думал, как сделать было с помощью, например

string page = HttpContext.Request.Query["page"] 

Проблема заключается в том, что HttpContext.Request.Query["page"] не возвращает строку, а StringValues.

Как бы то ни было, как использовать IQueryCollection для фактического считывания значений querystring?

+0

Я написал пост для того же, который вы можете найти здесь: https://neelbhatt40.wordpress.com/ 2017/07/06/query-string-in-net-core-and-mvc-6/ – Neel

ответ

23

Вы можете использовать метод ToString на IQueryCollection который будет возвращать требуемое значение, если один page параметр указывается:

string page = HttpContext.Request.Query["page"].ToString(); 

, если есть несколько значений, как ?page=1&page=2 то результат вызова ToString будет 1,2

Но, как предложил @ mike-g в своем ответе, вы бы лучше использовали привязку модели, а не прямой доступ к объекту HttpContext.Request.Query.

+2

ToString не требуется. Компилятор будет использовать его неявно, если вы присвойте значение запроса строке. –

5

IQueryCollection имеет на нем TryGetValue(), который возвращает значение с заданным ключом. Так что, если у вас есть параметр запроса с именем someInt, вы можете использовать его так:

var queryString = httpContext.Request.Query; 
StringValues someInt; 
queryString.TryGetValue("someInt", out someInt); 
var daRealInt = int.Parse(someInt); 

Обратите внимание, что если у вас есть несколько параметров одного и того же имени, StringValues тип не является проблемой.

+0

Чтобы добавить к этому ответу, если вы вызываете StringValues.ToString(), вы можете передать его непосредственно в строку, если это то, что вам нужно. – eltiare

0

Вот пример кода, я использовал (с .net ядра на просмотр):

@{ 
    Microsoft.Extensions.Primitives.StringValues queryVal; 

    if (Context.Request.Query.TryGetValue("yourKey", out queryVal) && 
     queryVal.FirstOrDefault() == "yourValue") 
    { 
    } 
}