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