我可以将多个查询字符串值映射到单个控制器(对象)参数吗?

时间:2012-08-31 09:19:30

标签: c# asp.net-web-api query-string model-binding

我正在构建一个ASP.NET Web API REST服务。

我必须处理的调用(URL)由另一方修复,并且有许多查询字符串参数。

有没有办法将查询参数映射到对象并将其传递给控制器​​,而不是让我的控制器使用十几个参数?

我知道我可以通过GetQueryNameValuePairs在控制器中访问它们,但我想知道是否有办法以这种方式使用数据绑定。

3 个答案:

答案 0 :(得分:2)

是,

定义模型,例如:

public class InputModel
{
    public string Param1 { get; set; }
    public string Param2 { get; set; }
}

然后调整你的行动:

public HttpResponseMessage Put(InputModel model) { ... }

与MVC非常相似,API控制器支持模型绑定,有一个基础设施来处理它,它本身是可扩展的。我想去看看ASP.NET MVC Model Binding的例子。

答案 1 :(得分:2)

在将模型对象传递给控制器​​时,ASP.NET Web API似乎需要使用[FromUri]。例如:

public HttpResponseMessage Post([FromUri] MyModel model) { ... }

有关详细信息,请参阅此MSDN blog post

答案 2 :(得分:1)

我只想创建一个查询字符串解析器:

protected IDictionary<string, string> GetQueryParameters(string queryString)
{
    var retval = new Dictionary<string, string>();
    foreach (var item in queryString.TrimStart('?').Split(new[] {'&'}, StringSplitOptions.RemoveEmptyEntries))
    {
        var split = item.Split('=');
        retval.Add(split[0], split[1]);
    }
    return retval;
}

然后从控制器调用:

public class DummyController : ApiController
{
    [HttpGet]
    public string SayHello(string name="")
    {
        var q = GetQueryParameters(Request.RequestUri.Query);

        return string.Format("Hello {0}", name);
    }
}