【问题标题】:Passing querystring parameters without using OData conventions?在不使用 OData 约定的情况下传递查询字符串参数?
【发布时间】:2012-06-09 03:41:16
【问题描述】:

有没有办法在不使用此处概述的 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

我收到以下错误:

在控制器“类别”上找不到与 请求。

关于如何在 ASP.NET MVC4 Web Api 中合理使用查询字符串有什么建议吗?

【问题讨论】:

  • 我相信这可能是 WebAPI 中的一个错误。您能否尝试将您的操作方法参数更改为不具有默认值(并发出带有查询字符串中所有必需值的请求)。
  • 当然,marcind,我会试试看的。

标签: c# asp.net-mvc-4 asp.net-web-api asp.net-mvc-routing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    当您开始使用查询字符串时,您实际上调用了控制器的精确方法及其参数。我更喜欢你改变你的路由器:

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

    【讨论】:

    • 我实际上使用了第二个选项并且它有效,但它使 URI 不直观且无法“破解”
    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 2017-12-24
    • 2016-09-14
    • 1970-01-01
    • 2013-01-02
    • 2011-10-31
    • 2013-01-26
    • 1970-01-01
    相关资源
    最近更新 更多