我的结构与此类似:
[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
为空。在我们的控制器中,我们有许多公共HttpGet方法可以正常工作,并且当将参数更改为单个int时,它可以工作。我已经尝试将参数类型更改为int[]
和IEnumerable<int>
,但没有更改。
但是,当将调用更改为HttpPost并将列表作为x-www-form-urlencoded值传递时,该方法可以正常工作。
是否可以将列表传递给Get方法,还是必须使用Post?因为它实际上不是post方法(因为它返回值的JSON模型,并且没有任何内容保存到服务器)。
答案 0 :(得分:33)
如果您使用的是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)
答案 1 :(得分:4)
这是一个快速入侵,直到找到更好的解决方案:
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 */
...
答案 2 :(得分:1)
如果您使用的是.Net Core,则除了@LiranBrimer:
[HttpGet("GetTotalItemsInArray")]
public ActionResult<int[]> GetTotalItemsInArray([FromQuery]int[] listOfIds)
{
return Ok(listOfIds);
}
答案 3 :(得分:0)
到目前为止,我有@oleksii的评论和@ C.B的答案的组合,但使用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链接的答案从here更改为使用Params
而不是Forms
,并将其与来自@的建议相结合CB将字符串值解析为int。
虽然这允许传统的listOfIds=1&listOfIds=2
,但它仍然需要将字符串转换为整数。
答案 4 :(得分:-1)
您还可以在客户端的请求字符串中传递序列化数组,并在服务器端反序列化:
var listOfIds = [1,2,3,45];
var ArrlistOfIds = JSON.stringify(listOfIds);
对于查询字符串:
"MyMethod?listOfIds=" + ArrlistOfIds
然后在服务器端,只需反序列化:
public ActionResult MyMethod(string listOfIds = null)
{
List<string> arrStatus = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<string[]>(arrStatusString).ToList();
.......
}
现在您有一个可以解析为int的ID列表。 Int32.TryParse(id, out result)