Binding 在ASP.NETWebAPI中,如何将多个http查询参数映射到单个方法参数

Binding 在ASP.NETWebAPI中,如何将多个http查询参数映射到单个方法参数,binding,asp.net-web-api,Binding,Asp.net Web Api,我们正在使用ASP.NETWebAPI生成一个提要,其中包括分页功能 myfeed.com/afeed?page=2 我的老板说让我们也允许用户使用“paged”,因为WP就是这么用的。此外,我们还在一些旧的提要中使用pageIndex。所以我想做的是接受这三个 myfeed.com/afeed?page=2 myfeed.com/afeed?paged=2 myfeed.com/afeed?pageIndex=2 我想做的是能够编写一个干净的WebAPI方法,比如 public F

我们正在使用ASP.NETWebAPI生成一个提要,其中包括分页功能

myfeed.com/afeed?page=2
我的老板说让我们也允许用户使用“paged”,因为WP就是这么用的。此外,我们还在一些旧的提要中使用pageIndex。所以我想做的是接受这三个

myfeed.com/afeed?page=2
myfeed.com/afeed?paged=2
myfeed.com/afeed?pageIndex=2
我想做的是能够编写一个干净的WebAPI方法,比如

    public Foo Get(int page = 1)
    {
        //do some stuff
        return foo;
    }
不会使方法与“管道”页面混淆。所以我尝试创建一个ActionFilter

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        object pageParam = new object(); //query["page"]
        if (pageParam == null)
        {
            var altPageParam = GetPageParamUsingAlternateParams(actionContext);
            if (altPageParam != null){}
                //SetPageParam here
        }

        base.OnActionExecuting(actionContext);
    }

    private object GetPageParamUsingAlternateParams(HttpActionContext actionContext)
    {
        object result = new object();
        object pageIndexParam = new object();   //Query["pageIndex"]
        object pagedParam = new object();   ////Query["paged"]

        if (pagedParam != null)
            result = pagedParam;
        else if (pageIndexParam != null)
            result = pageIndexParam;

        return result;
    }
我没做完。当我在寻找获取查询参数的最佳方法时,我犯了一个大错误

OnActionExecuting在int page=1之后执行。当然,我可以在ActionFilter中覆盖它,但这会导致以后的混乱。我真的希望能够通过从

页面->页面->页面索引->方法中的默认值


我发现了很多关于对象自定义绑定的文章。此外,我还找到了一些关于参数绑定的文章,但是这些文章涉及到了FromUri和FromBody。我没有发现任何与我面临的问题有直接相似之处。

您可以通过定义3种不同的GET方法,并使用与Url的查询段匹配的参数来实现,如下面的代码片段所示:

 public class ProductsController : ApiController
    {

        //Matched api/products?page=1
        public IHttpActionResult Get(int page)
        {
            return GetPagedData(page);
        }

        //Matched api/products?paged=1
        public IHttpActionResult GetPaged(int paged)
        {
            return GetPagedData(paged);
        }
        //Matched api/products?pagIndex=1
        public IHttpActionResult GetPageIndex(int pageIndex)
        {
            return GetPagedData(pageIndex);
        }

        //Do the real paging here
        private IHttpActionResult GetPagedData(int page =1)
        {
            return Ok("Data Pages");
        }
    }

谢谢这确实解决了这个精确的解决方案,但我想知道是否有一个更通用的解决方案不需要编写单独的方法。如果我想向另一个变量添加相同的功能,比如使用count、size或pageSize,那么方法的数量会迅速增加。在这种情况下,您应该创建一个新的自定义操作选择器继承ApicontrollerActionSelector。因此,理论上,客户端只会发送一个页面变量。但是对于API/products这样的请求,Web API将如何处理它呢?pageIndex=1&paged=2如果您没有一个名为pageIndex和paged的两个参数的方法,那么由于不明确,将引发异常。从这里开始更多