web-dev-qa-db-ja.com

ASP.NET MVC ApiControllerでGETパラメーターを取得する方法

私はこれを尋ねるのは少し馬鹿げていると感じますが、たとえば_/api/foo?sort=name_でgetリクエストのパラメーターを取得する方法を見つけることができません。

ApiControllerクラスでは、public string Get()を指定しました。 Get(string sort)を指定すると、_/api/foo_が不正な要求になります。 ApiControllerのリクエストインスタンスは、タイプ_System.Net.Http.HttpRequestMessage_です。 QueryStringまたはParametersプロパティなどはありません。

26
xster

あなたはただ使うことができます

HttpContext.Current.Request.QueryString
19
Josh Mouch

ApiControllerは、HttpContextオブジェクトなしで動作するように設計されています(移植可能にし、IISの外部でホストできるようにします)。

クエリ文字列パラメーターには引き続きアクセスできますが、次のプロパティを使用してアクセスできます。

Request.GetQueryNameValuePairs()

すべての値をループ処理する例を次に示します。

foreach (var parameter in Request.GetQueryNameValuePairs())
{
     var key = parameter.Key;
     var value = parameter.Value;
}
29
Darren

以下は、リクエストからクエリ文字列qを取得し、それを使用してアカウントをクエリする例です。

        var q = Request.GetQueryNameValuePairs().Where(nv => nv.Key =="q").Select(nv => nv.Value).FirstOrDefault();
        if (q != null && q != string.Empty)
        {
            var result = accounts.Where(a=>a.Name.ToLower().StartsWith(q.ToLower()));
            return result;
        }
        else
        {
            throw new Exception("Please specify a search query");
        }

これは、次のように呼び出すことができます。

url/api/Accounts?q = p

6
Mark

すべてのクエリ文字列の名前/値のペアを変数に取得します。

IEnumerable<KeyValuePair<string, string>> queryString = request.GetQueryNameValuePairs();

次に、指定されたクエリ文字列パラメーターを抽出します

string value = queryString.Where(nv => nv.Key == "parameterNameGoesHere").Select(nv => nv.Value).FirstOrDefault();
4
Chris Halcrow

以下を使用することもできます

var value = request.GetQueryNameValuePairs().Where(m => m.Key == "paramName").SingleOrDefault().Value;
2
Khateeb321

そのリクエストに適切なモデルがある場合

例えば

  public class JustModel 
    {
      public int Id {get;set;}
      public int Age {gets;set;}
    }

そして、このようなクエリ

/api/foo?id=1&Age=10

[FromUri]属性を使用できます

例えば

public IHttpActionResult GetAge([FromUri] JustModel model){}
0
So_oP

OData Webサービスを構築しようとしていますか?その場合は、IQueryableを返すだけで、あとはWeb APIが処理します。

0
Leon Cullens