在不使用 OData 约定的情况下传递查询字符串参数

本文关键字:查询 字符串 参数 情况下 OData 约定 | 更新日期: 2023-09-27 18:36:20

有没有办法在不使用此处概述的 OData 约定的情况下将查询字符串参数传递给 ASP.NET MVC4 Web API 控制器?

http://www.asp.net/web-api/overview/web-api-routing-and-actions/paging-and-querying

我有一些使用 Dapper 构建的存储库方法,它们不支持 IQueryable,并希望能够在不使用 OData 约定的情况下手动分页它们,但是每当我尝试以传统的 ASP.NET 方式执行此操作时,我都会收到"找不到路由"错误。

例如,这里有一条路线:

context.Routes.MapHttpRoute(
           name: "APIv1_api_pagination",
           routeTemplate: "api/v1/{controller}/{id}",
           defaults: new { area = AreaName, controller = "category", offset = 0, count = 100});

这是要匹配的签名

public class CategoryController : ApiController
{
    // GET /api/<controller>
    public HttpResponseMessage Get(int id, int offset = 0, int count = 0)

每当我传递以下查询时:

http://localhost/api/v1/category/1?offset=10

我收到以下错误:

在控制器"类别"上未找到与 请求。

关于如何在 MVC4 Web API 中理智地使用查询字符串 ASP.NET 任何建议?

在不使用 OData 约定的情况下传递查询字符串参数

当你开始使用查询字符串时,你实际上调用了控制器的确切方法及其参数。我希望你像这样更换路由器:

context.Routes.MapHttpRoute(
       name: "APIv1_api_pagination",
       routeTemplate: "api/v1/{controller}/{action}/{id}",
       defaults: new { area = AreaName, controller = "category", offset = 0, count = 100});

然后将您的方法更改为

public HttpResponseMessage Items(int id, int offset = 0, int count = 0);

从现在开始,只要您查询喜欢

http://localhost/api/v1/category/Items?id=1&offset=10&count=0

它将运行。

在写这篇文章时,我想到了另一种方法。我不知道它是否有效,但请尝试像更改路由器一样

context.Routes.MapHttpRoute(
       name: "APIv1_api_pagination",
       routeTemplate: "api/v1/{controller}/{id}/{offset}/{count}",
       defaults: new { area = AreaName, controller = "category", offset = RouteParameter.Optional, count = RouteParameter.Optional});

在这种情况下,我遇到的问题是我的 WebApi 控制器实例上有多个 GET 重载。当我删除它们(并将所有内容压缩为一个在方法本身中具有更多可选参数和控制流的 Get 方法)时,一切都按预期工作。