34

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).

4

5 回答 5

47

If you are using MVC WebAPI, then you can declare your method like this:

[HttpGet]
public int GetTotalItemsInArray([FromQuery]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)

于 2014-05-11T12:39:57.100 回答
3

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 */
    ...
于 2013-06-10T10:37:45.957 回答
3

In addition to @LiranBrimer if you are using .Net Core:

[HttpGet("GetTotalItemsInArray")]
public ActionResult<int[]> GetTotalItemsInArray([FromQuery]int[] listOfIds)
{
       return Ok(listOfIds);
}
于 2020-05-19T11:22:27.813 回答
0

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.

于 2013-06-10T11:22:51.133 回答
-2

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)

于 2016-07-21T14:29:25.703 回答