多个参数名称相同

时间:2015-05-19 06:40:43

标签: asp.net-web-api

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

现在我试着了解当时和那里发生了什么。我没有收到任何错误消息,但函数的输出不符合预期。

1 个答案:

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