问题
I have a function similar in structure to this:
[HttpGet]
public HttpResponseMessage GetValuesForList(List<int> listOfIds)
{
/* create model */
foreach(var id in listOfIds)
model.Add(GetValueForId(id)
/* create response for model */
return response;
}
However, when I do a Get request for the method:
{{domain}}/Controller/GetValuesForList?listOfIds=1&listOfIds=2
I get an error when debugging stating that listOfIds
is null. In our controller we have a number of public HttpGet methods that work fine, and when changing the parameter to a single int it works. I've tried changing the parameter type to int[]
and IEnumerable<int>
too, but no change.
However, when changing the call to a HttpPost and passing the list as an x-www-form-urlencoded value, the method works.
Is it possible to pass a list to a Get method, or will I have to use Post? Since it's not actually a post method (as it returns a JSON model of values and nothing is saved to the server).
回答1:
If you are using MVC WebAPI, then you can declare your method like this:
[HttpGet]
public int GetTotalItemsInArray([FromUri]int[] listOfIds)
{
return listOfIds.Length;
}
and then you query like this:
blabla.com/GetTotalItemsInArray?listOfIds=1&listOfIds=2&listOfIds=3
this will match array [1, 2, 3] into listOfIds param (and return 3 as expected)
回答2:
Here's a quick hack until you find a better solution:
- use "?listOfIds=1,2,5,8,21,34"
- then:
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 */
...
回答3:
So far I have a combination of the comment by @oleksii and the answer from @C.B, but using TryParse to deal with errors and a null check to make it an optional parameter.
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
}
}
Since the values are not passed from a form I had to change the answer @oleksii linked to from here to use Params
instead of Forms
and combined that with the suggestion from @C.B. to parse the string values to int.
While this allows for the traditional listOfIds=1&listOfIds=2
, it still requires converting strings to ints.
回答4:
You can also pass the serialized array in the request string on client and deserialize on server side:
var listOfIds = [1,2,3,45];
var ArrlistOfIds = JSON.stringify(listOfIds);
For the query string:
"MyMethod?listOfIds=" + ArrlistOfIds
And then in the server side, just deserialize:
public ActionResult MyMethod(string listOfIds = null)
{
List<string> arrStatus = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<string[]>(arrStatusString).ToList();
.......
}
Now you have a list of ids that could be parsed to int. Int32.TryParse(id, out result)
来源:https://stackoverflow.com/questions/17021624/passing-a-list-of-int-to-a-httpget-request