2015-05-19 19 views
1

考虑以下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

想知道,如果它是W3C兼容多次出现查询字符串参数 –

回答

3

的Web API参数绑定不能几个参数从查询字符串转换成一个数组,所以你有两个选择:

第二个选项包括获取查询字符串名称 - 值对,并自己解析它们。要获取名称值对,用这个:

Request.GetQueryNameValuePairs() 

要提取整型值,你可以做这样的事情:

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)); 
}