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

C# 我可以将多个查询字符串值映射到单个控制器(对象)参数吗?,c#,asp.net-web-api,query-string,model-binding,C#,Asp.net Web Api,Query String,Model Binding,我正在构建一个ASP.NET Web API REST服务 我必须处理的调用(URL)由另一方修复,并且有许多查询字符串参数 与其让我的控制器接受十几个参数,还有什么方法可以将查询参数映射到一个对象并将其传递给控制器 我知道我可以通过GetQueryNameValuePairs在控制器中访问它们,但我想知道是否有办法以这种方式使用数据绑定。是 定义一个模型,例如: public class InputModel { public string Param1 { get; set; }

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

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

与其让我的控制器接受十几个参数,还有什么方法可以将查询参数映射到一个对象并将其传递给控制器

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

定义一个模型,例如:

public class InputModel
{
    public string Param1 { get; set; }
    public string Param2 { get; set; }
}
然后调整你的行动:

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

与MVC非常相似,API控制器支持模型绑定,有一个适当的基础设施来处理这个问题,它本身是可扩展的。我会在谷歌上搜索ASP.NET MVC模型绑定的示例。

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

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

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

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

有关详细信息,请参见此项。

我尝试了此操作,但我的模型参数始终为空。我在查询字符串中有一个“orderNumber”,在模型类中有一个orderNumber属性,但它似乎没有绑定。不确定我是否遗漏了一些明显的内容。当我使用标准MVC控制器时,绑定很好。似乎您需要使用[FromUri]属性-例如公共HttpResponseMessage Post([FromUri]MyModel model model)。一些详细信息:如果您想同时接受Post和GET操作,则此操作不起作用。您可以使用[FromUri],但它只能从querystring中工作,不能从PostBuffer或原始数据中工作。实际上,这是Web API的一个主要缺点——灵活性远远低于MVC在ModelBinding中提供的灵活性。
public HttpResponseMessage Post([FromUri] MyModel model) { ... }