将int列表传递给HttpGet请求

我的结构与此类似:

[HttpGet] public HttpResponseMessage GetValuesForList(List 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 ,但没有更改。

但是,当将调用更改为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 param(并按预期返回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 */ ... 

到目前为止,我有@oleksii的评论和@CB的答案的组合,但使用TryParse处理错误和空检查使其成为可选参数。

 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从这里链接的答案,使用Params而不是Forms ,并将其与@CB的建议结合起来,将字符串值解析为int。

虽然这允许传统的listOfIds=1&listOfIds=2 ,但它仍然需要将字符串转换为int。

您还可以在客户端上的请求字符串中传递序列化数组,并在服务器端反序列化:

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

对于查询字符串:

 "MyMethod?listOfIds=" + ArrlistOfIds 

然后在服务器端,只需反序列化:

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

现在您有一个可以解析为int的id列表。 Int32.TryParse(id, out result)