我想从ASP.NET Web API中的请求查询字符串绑定到动态对象。虽然使用[FromUri]
装饰action参数与普通类一起使用,但它似乎不适用于动态(动态对象为空)。
public dynamic Get(string id, [FromUri]dynamic criteria)
{
return Ok();
}
请注意,这需要适用于GET请求,因此没有正文。
答案 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>