1

是否有可能采取行动?

    [HttpGet]
    public List<Product> GET(int CategoryId, string option, params string[] properties)
    {
        List<Product> result = new List<Product>();
        result = BusinessRules.getProductsByCategoryId(CategoryId);
        return result;
    }

使 URL 看起来像“/api/Products/CategoryId/full/Name/ProductID/”

它调用该动作可能是因为属性是可选的,但属性参数始终为空。我什至尝试在请求正文中传递 Name 和 ProductID 参数,但属性仍然为空。我想使用“参数”,因为我想将 0..N 个参数传递给操作。

这是路线模板。

    config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{CategoryId}/{option}/{*properties}",
            constraints: new { CategoryId = @"\d+" },
            defaults: new { option = RouteParameter.Optional, properties = RouteParameter.Optional }
    );
4

1 回答 1

2

看看这篇文章:http ://www.tugberkugurlu.com/archive/asp-net-web-api-catch-all-route-parameter-binding

它通过创建自定义参数绑定将任何包罗万象的查询参数转换为数组。我喜欢不要在全球范围内注册它,而是用它来装饰你需要它的地方,就像这样:

 public HttpResponseMessage Get([BindCatchAllRoute('/')]string[] tags) { ...

当然,您始终可以使用常规查询字符串。这当然很容易:

[HttpGet]
public List<Product> GET(int CategoryId, string option, [FromUri] string[] properties = null)
{
    List<Product> result = new List<Product>();
    result = BusinessRules.getProductsByCategoryId(CategoryId);
    return result;
}

并这样称呼它:/api/Products/123/full/?properties=Name&properties=ProductID

于 2013-04-10T00:41:01.017 回答