私はこれに似た構造の機能を持っています:
[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モデルを返し、サーバーに何も保存されないため)。
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を返します)
より良い解決策を見つけるまでの簡単なハックです。
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 */
...
これまでのところ、@ 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に変換する必要があります。