在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请求工作,所以没有正文。
您可能对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>