从ASP.NET Web API中的Query String绑定到动态对象

时间:2014-08-04 12:22:33

标签: c# asp.net-web-api

我想从ASP.NET Web API中的请求查询字符串绑定到动态对象。虽然使用[FromUri]装饰action参数与普通类一起使用,但它似乎不适用于动态(动态对象为空)。

public dynamic Get(string id, [FromUri]dynamic criteria)
{
    return Ok();
}

请注意,这需要适用于GET请求,因此没有正文。

3 个答案:

答案 0 :(得分:5)

您可能对GetQueryNameValuePairs扩展方法(docs)感兴趣。

虽然它不会将查询参数绑定到模型,但它允许您通过类似字典的对象以动态方式(这听起来像是您的最终目标)访问查询参数。

另请参阅this answer。

var dict = new Dictionary<string, string>();
var qnvp = this.Request.GetQueryNameValuePairs();

foreach (var pair in qnvp)
{
    if (dict.ContainsKey(pair.Key) == false)
    {
        dict[pair.Key] = pair.Value;
    }
}    

答案 1 :(得分:3)

是的,它无法运作。 [FormUri]属性尝试按名称将对象属性绑定到查询字符串属性。 动态对象没有属性,因此无法绑定。

您可以创建自己的模型绑定器来实现该目标。我不建议那样走但是有可能。

&#34;问题&#34;在这种情况下,动态是它不是编译器安全的,如果您期望的参数不是请求的一部分,您可以在运行时获得错误。

答案 2 :(得分:0)

虽然Web API在使用单个参数覆盖Multiple actions were found that match the request方法时会抱怨Get,但您可以通过添加其他参数来“欺骗”默认模型绑定器以绑定所需的模型。

public class House
{
    public string Color { get; set; }
    public double SquareFeet { get; set; }
    public override string ToString()
    {
        return "Color: " + Color + ", Sq. Ft.:" + SquareFeet;
    }
}

public class Car
{
    public string Color { get; set; }
    public double EngineSize { get; set; }
    public override string ToString()
    {
        return "Color: " + Color + ", cc: " + EngineSize;
    }
}

public class ValuesController : ApiController
{
    public string Get([FromUri] bool house, [FromUri] House model)
    {
        return model.ToString();
    }

    public string Get([FromUri] bool car, [FromUri] Car model)
    {
        return model.ToString();
    }
}

使用上面的代码,以下URL产生相应的输出:

<强>〜/ API /值房子=真安培;颜色=白色&安培; squarefeet = 1500

<string>Color: white, Sq. Ft.:1500</string>

<强>〜/ API /值汽车=真安培;颜色=黑色&安培; enginesize = 2500

<string>Color: black, cc: 2500</string>