Binding 在ASP.NETWebAPI中,如何将多个http查询参数映射到单个方法参数
我们正在使用ASP.NETWebAPI生成一个提要,其中包括分页功能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
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的两个参数的方法,那么由于不明确,将引发异常。从这里开始更多