【问题标题】:In ASP.Net Web API, how do I map multiple http query parameters to a single method parameter在 ASP.Net Web API 中,如何将多个 http 查询参数映射到单个方法参数
【发布时间】:2014-05-03 22:01:02
【问题描述】:

我们使用 ASP.Net Web API 来生成提要,它包括分页功能。

myfeed.com/afeed?page=2

我的老板说“让我们也允许用户使用‘分页’,因为这是 WP 使用的。”此外,我们还在一些较旧的提要中使用 pageIndex。所以我想做的就是接受这三个。

myfeed.com/afeed?page=2
myfeed.com/afeed?paged=2
myfeed.com/afeed?pageIndex=2

我想做的是能写一个干净的Web API方法,比如

    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;
    }

我没有说完。当我在寻找获取查询参数的最佳方法时,我偶然发现了一个大错误!

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

的 URI 查询参数做一个简单的流程

page -> paged -> pageIndex -> 方法中的默认值

我发现了很多关于自定义绑定到对象的文章。此外,我还找到了有关“参数绑定”的文章,但这些文章涉及 FromUri 和 FromBody。我没有发现任何我认为与我所面临的事情直接相似的事情。

【问题讨论】:

    标签: binding asp.net-web-api


    【解决方案1】:

    你可以通过定义 3 种不同的 GET 方法来实现你想要的,这些方法的参数与 Url 的查询段匹配,如下面的代码 sn-p:

     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?pageIndex=1&paged=2 之类的请求,Web API 将如何处理它?
    • 如果你没有一个方法有两个参数,名为 pageIndex 和 paged,那么会因为歧义而抛出异常。更多来自这里asp.net/web-api/overview/web-api-routing-and-actions/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2012-03-29
    相关资源
    最近更新 更多