考虑以下ApiController:
public class SomeController : ApiController
{
[HttpGet]
public class SomeFunction(int someVal = 0) {
...
}
}
这可以按预期工作:
http://myserver/myApp/Some/SomeFunction?someVal=0
但是当用
调用它时,我遇到了这个函数的问题http://myserver/myApp/Some/SomeFunction?someVal=0&someVal=0
现在我试着了解当时和那里发生了什么。我没有收到任何错误消息,但函数的输出不符合预期。
答案 0 :(得分:3)
Web API参数绑定无法将查询字符串中的多个参数转换为数组,因此您必须有两个选项:
第二个选项包括获取查询字符串名称 - 值对,并自行解析它们。要获取名称值对,请使用:
Request.GetQueryNameValuePairs()
要提取int值,您可以执行以下操作:
var values= Request.GetQueryNameValuePairs()
.Where(kvp => kvp.Key == "someVal")
.Select(kvp => int.Parse(kvp.Value))
.ToArray();
当然,你应该控制解析上的错误等等。这是一个基本的示例代码。
这是第一个选项的模型绑定器的实现:
public class IntsModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType != typeof (Ints))
{
return false;
}
var intValues = actionContext.Request.GetQueryNameValuePairs()
.Where(kvp => kvp.Key == bindingContext.ModelName)
.Select(kvp => int.Parse(kvp.Value))
.ToList();
bindingContext.Model = new Ints {Values = intValues};
return true;
}
}
同样,这是一个基本的实现,在其他事情之间,缺乏对错误的控制。
这是在动作中使用它的方法之一,但是,请阅读参数绑定的链接以查看其他(更好)的使用方法:
// GET api/Test?keys=1&keys=7
public string Get([ModelBinder(typeof(IntsModelBinder))]Ints keys)
{
return string.Format("Keys: {0}", string.Join(", ", keys.Values));
}