在ASP中从查询字符串绑定到动态对象.. NET Web API

本文关键字:对象 动态 NET Web API 绑定 ASP 查询 字符串 | 更新日期: 2023-09-27 18:16:40

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

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

请注意,这需要为GET请求工作,所以没有正文。

在ASP中从查询字符串绑定到动态对象.. NET Web API

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

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

同样,请看这个答案。

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

不行。[FormUri]属性试图通过名称将对象属性绑定到查询字符串属性。动态对象没有属性,所以不能绑定。

您可以创建自己的模型绑定器来实现此目标。我不建议你那样做,但这是可能的。

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

当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/价值观?房子= true&颜色= white& squarefeet = 1500

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

~/api/价值观?车= true&颜色= black& enginesize = 2500

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