如何通过重定向将OData查询参数从一个操作传递到另一个操作

时间:2013-03-17 20:48:15

标签: asp.net-web-api asp.net-web-api-routing

我有以下场景:带有“GetAll”方法的ProductsController接受ODataQueryOptions,如下所示:

    [GET("Products", RouteName = "GetAllProducts")]
    public ProductDTO[] Get(ODataQueryOptions options)
    {  
       //parse the options and do whatever...
        return new ProductDTO[] { };
    }

和具有GetProducts方法的CategoryController如下:

    [GET("Category/{id}/Products", RouteName = "GetProductsByCategory")]
    public HttpResponseMessage GetProducts(int id, ODataQueryOptions options)
    {
        //Request URL can be "api/Category/12/Products?$select=Name,Price&$top=10"
        //Need to do a redirect the ProductsController "GetAllProducts" action
        HttpResponseMessage msg = new HttpResponseMessage(HttpStatusCode.RedirectMethod);
        msg.Headers.Location = new Uri(Url.Link("GetAllProducts",options));
        // how do we send the odata query string"$select=Name,Price&$top=10"
        //to the ProductsController? passing "options" directly does not work!
        return msg;
    }

我不想重新定义在CategoryController中按特定类别获取产品的逻辑。 有没有办法

1)将ODataQueryOptions作为重定向的一部分传递?

2)是否可以修改选项以添加其他过滤条件?在上面的示例中,我想在执行重定向之前为当前的CategoryID添加一个额外的过滤器critera,以便“GetAllProducts”将收到以下请求:   “api / Products?$ select = Name,Price& $ top = 10& $ filter = CategoryID eq 12

上述内容是否有意义,还是我应该以不同的方式接近?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以使用此帮助程序从请求中获取OData查询字符串。

    private static string GetODataQueryString(HttpRequestMessage request)
    {
        return
            String.Join("&", request
                                .GetQueryNameValuePairs()
                                .Where(kvp => kvp.Key.StartsWith("$"))
                                .Select(kvp => String.Format("{0}={1}", kvp.Key, Uri.EscapeDataString(kvp.Value))));
    }