web-dev-qa-db-ja.com

intのリストをHttpGetリクエストに渡す

私はこれに似た構造の機能を持っています:

[HttpGet]
public HttpResponseMessage GetValuesForList(List<int> listOfIds)
{
    /* create model */        

    foreach(var id in listOfIds)
        model.Add(GetValueForId(id)

    /* create response for model */
    return response;
}

ただし、メソッドのGetリクエストを行うと:

{{domain}}/Controller/GetValuesForList?listOfIds=1&listOfIds=2

listOfIdsがnullであることを示すデバッグ時にエラーが発生します。コントローラーには、正常に機能する多数のパブリックHttpGetメソッドがあり、パラメーターを単一のintに変更すると機能します。パラメータタイプをint[]およびIEnumerable<int>に変更しようとしましたが、変更はありません。

ただし、HttpPostへの呼び出しを変更し、リストをx-www-form-urlencoded値として渡すと、メソッドは機能します。

リストをGetメソッドに渡すことは可能ですか、それともPostを使用する必要がありますか?実際にはpostメソッドではないため(値のJSONモデルを返し、サーバーに何も保存されないため)。

21
StormPooper

MVC WebAPIを使用している場合、次のようにメソッドを宣言できます。

[HttpGet]
public int GetTotalItemsInArray([FromUri]int[] listOfIds)
{
       return listOfIds.Length;
}

そして、次のようにクエリします:blabla.com/GetTotalItemsInArray?listOfIds=1&listOfIds=2&listOfIds=3

これは、配列[1、2、3]をlistOfIdsパラメーターに一致させます(予想どおり3を返します)

36
Liran Brimer

より良い解決策を見つけるまでの簡単なハックです。

  • 「?listOfIds = 1,2,5,8,21,34」を使用します
  • その後:
GetValuesForList(string listOfIds)
{
    /* [create model] here */
    //string[] numbers = listOfIds.Split(',');
    foreach(string number in listOfIds.Split(','))
        model.Add(GetValueForId(int.Parse(number))
    /* [create response for model] here */
    ...
5
C.B.

これまでのところ、@ oleksiiによるコメントと@ C.Bからの回答の組み合わせがありますが、TryParseを使用してエラーを処理し、nullチェックを使用してオプションのパラメーターにします。

var paramValues = HttpContext.Current.Request.Params.GetValues("listOfIds");
if (paramValues != null)
{
   foreach (var id in paramValues)
   {
        int result; 
        if (Int32.TryParse(id, out result))
            model.Add(GetValueForId(Add(result));
        else
           // error handling
    }
}

フォームから値が渡されないため、リンクされた回答@oleksiiを here から変更して、Paramsの代わりにFormsを使用し、それを提案と組み合わせる必要がありました。 @CBから文字列値をintに解析します。

これにより、従来のlistOfIds=1&listOfIds=2、文字列をintに変換する必要があります。

0
StormPooper