C# 在不使用OData约定的情况下传递querystring参数?

C# 在不使用OData约定的情况下传递querystring参数?,c#,asp.net-mvc-4,asp.net-web-api,asp.net-mvc-routing,C#,Asp.net Mvc 4,Asp.net Web Api,Asp.net Mvc Routing,有没有一种方法可以将查询字符串参数传递给ASP.NET MVC4 Web Api控制器,而不使用此处概述的OData约定 我有一些使用Dapper构建的存储库方法,它们不支持IQueryable,并且希望能够在不使用OData约定的情况下手动对它们进行分页,但每当我尝试使用传统的ASP.NET方式进行分页时,都会出现“route not found”错误 例如,这里有一条路线: context.Routes.MapHttpRoute( name: "APIv1_api_p

有没有一种方法可以将查询字符串参数传递给ASP.NET MVC4 Web Api控制器,而不使用此处概述的OData约定

我有一些使用Dapper构建的存储库方法,它们不支持IQueryable,并且希望能够在不使用OData约定的情况下手动对它们进行分页,但每当我尝试使用传统的ASP.NET方式进行分页时,都会出现“route not found”错误

例如,这里有一条路线:

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)
公共类CategoryController:ApicController
{
//GET/api/
公共HttpResponseMessage获取(int-id,int-offset=0,int-count=0)
每当我通过以下查询时:

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

我得到以下错误:

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


关于如何在ASP.NET MVC4 Web Api中合理使用querystring的任何建议?

当您开始使用querystring时,您实际上会使用其参数调用控制器的确切方法。我希望您更改路由器的方式如下:

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方法,其中包含更多可选参数和方法本身内的控制流)一切正常。

我认为这可能是WebAPI中的一个错误。您是否可以尝试将action method参数更改为没有默认值(并发出一个包含查询字符串中所有必需值的请求)当然,marcind,我会尝试一下。我实际上使用了第二个选项,它可以工作,但它使URI不直观,不可“黑客攻击”