/one?value=1&value=2&value=3
のような URL でリクエストがきた場合に、クエリ文字列の同じキーの値を配列として取得する方法。
ASP.NET Web API にて
- ApiController の Request プロパティからクエリ文字列を取得する
- アクションメソッドの引数にバインドさせる
の2つの方法がある。
using System.Linq; using System.Net.Http; using System.Web.Http; namespace QueryArray.Controllers { publicclass MyController : ApiController { //one?value=1&value=a//return:"1,a" [HttpGet] [Route("one")] publicstring Get() { string[] value = GetQueryString("value"); returnvalue == null ? string.Empty : string.Join(",", value); } //two?value=1&value=a//return:"1,a" [HttpGet] [Route("two")] publicstring Get([FromUri] int[] value) { returnvalue == null ? string.Empty : string.Join(",", value); } //three?value=1&value=a//return:"1,a" [HttpGet] [Route("three")] publicstring Get([FromUri]MyModel model) { if (model == null || model.Value == null) returnstring.Empty; returnstring.Join(",", model.Value); } /// <summary>/// 指定したキーのクエリ文字列の値を取得します/// </summary>/// <paramname="key"></param>/// <returns></returns>privatestring[] GetQueryString(string key) { return Request.GetQueryNameValuePairs() .Where(e => e.Key == key) .Select(e => e.Value) .ToArray(); } } publicclass MyModel { publicint[] Value { get; set; } } }
ASP.NET MVC では
ASP.NET MVC の場合も似た感じ。
ただ、Request.QueryString["value"] でカンマ区切りで返ってくるので、以下の通りとなる。
using System.Web.Mvc; namespace QueryArray.Controllers { publicclass HomeController : Controller { //Home/Array?value=1&value=apublic ActionResult Array() { string[] value = Request.QueryString["value"]?.Split(','); ViewBag.Message = value; return View(); } //Home/Array2?value=1&value=apublic ActionResult Array2(string[] value) { ViewBag.Message = value; return View(); } } }
違い
ASP.NET Web API の ApiController:
publicabstractclass ApiController : IHttpController, IDisposable { //....public System.Net.Http.HttpRequestMessage Request { get; set; } }
ASP.NET MVC の Controller:
publicabstractclass Controller : ControllerBase ... { //....public System.Web.HttpRequestBase Request { get; } }
HttpRequestBase は abstract。
ASP.NET Web API の方が、Request の差し替えができ単体テストもしやすい。