34

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

[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[]パラメータの型をandに変更しようとしましたIEnumerable<int>が、変更はありません。

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

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

4

5 に答える 5

3

より良い解決策が見つかるまでの簡単なハックを次に示します。

  • 「?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 */
    ...
于 2013-06-10T10:37:45.957 に答える
0

これまでのところ、@oleksii によるコメントと @CB からの回答を組み合わせていますが、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
    }
}

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

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

于 2013-06-10T11:22:51.133 に答える
-2

クライアントのリクエスト文字列でシリアル化された配列を渡し、サーバー側で逆シリアル化することもできます。

var listOfIds = [1,2,3,45];
var ArrlistOfIds = JSON.stringify(listOfIds);

クエリ文字列の場合:

"MyMethod?listOfIds=" + ArrlistOfIds

そして、サーバー側で逆シリアル化します。

public ActionResult MyMethod(string listOfIds = null)
{
    List<string> arrStatus = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<string[]>(arrStatusString).ToList();
    .......
}

これで、int に解析できる ID のリストができました。Int32.TryParse(id, out result)

于 2016-07-21T14:29:25.703 に答える