如何在Web API中传递可选参数

时间:2015-12-23 00:24:50

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

你能帮我在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=

任何人都可以提供帮助

2 个答案:

答案 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