你能帮我在uri中传递可选参数吗
[Route("api/values/{a}/{b?}/{c?}")]
public string Get(string a = "", string b = "", string c = "")
{
return string.Format("a={0}, b={1}, c={2}", a, b, c);
}
我可以打电话给api -
api/values/abc/pqr/xyz returns a=abc, b=pqr, c=xyz
api/values/abc/pqr returns a=abc, b=pqr, c=
但我想把api称为 -
api/values/abc//xyz which should return a=abc, b=, c=xyz
returns a=abc, b=xyz, c=
任何人都可以提供帮助
答案 0 :(得分:3)
这就是URI的方式 - 它们应该代表对象的特定路径。如果没有在路上指定“b”或“a”,您将无法进入“c”。
但如果你真的想,也许只是使用某种通配符作为价值?例如:/ api / values / abc / * / xyz,在您的代码中只检查路径的一部分是否是您的通配符。这样你就可以扩展URI的逻辑而不是破坏它。 URI将保持人类可读和明显(例如,获取容器ABC的某些后代的所有值XYZ)。
要保持DRY写一个自定义模型绑定器,它会将URL中找到的任何通配符转换为空(或其他)值,然后传递给控制器。看一下System.Web.Http.ModelBinding命名空间,开始使用。
答案 1 :(得分:2)
一个简单的解决方法是使用可选的查询参数:
[Route("api/values")]
public string Get(string a = "", string b = "", string c = "")
{
return string.Format("a={0}, b={1}, c={2}", a, b, c);
}
=>
/api/values?a=abc&c=xyz