【问题标题】:WebApi Pagination not working, page is always 0 even when I set url parameter correctlyWebApi 分页不起作用,即使我正确设置了 url 参数,页面也始终为 0
【发布时间】:2016-01-28 02:46:24
【问题描述】:

api控制器方法是这样的:

        public IHttpActionResult GettblEmpleados(int page, int pageSize)
        {
            var query = db.SPEmpleadosIntranet().ToList();

            var totalCount = query.Count();
            var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);

            var urlHelper = new UrlHelper(Request);
            var prevLink = page > 0 ? urlHelper.Link("Empleados", new { page = page - 1, pageSize = pageSize }) : "";
            var nextLink = page < totalPages - 1 ? urlHelper.Link("Empleados", new { page = page + 1, pageSize = pageSize }) : "";

            var results = query
            .Skip(pageSize * page)
            .Take(pageSize)
            .ToList();

            return Ok(query);
        }

而我用来消费服务的url是:

但是page总是0,那么prevLink总是空的 http://localhost:12929/api/Empleados?page=0&pageSize=10

我得到的错误是:(抱歉框架是西班牙语)

翻译说找不到路径/Empleados

No se encuentra ninguna ruta con el nombre 'Empleados' en la colección de rutas。\r\nNombre del parametro: name"

这是控制器

public class EmpleadosController : ApiController
{

这是 globa.asax

protected void Application_Start()
{
    GlobalConfiguration.Configuration.Formatters.Clear();
    GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);

更新1

这是 webapiconfig

public static void Register(HttpConfiguration config) 
        { 
            // Web API configuration and services 
            // Web API routes 
            config.MapHttpAttributeRoutes(); 
            config.Routes.MapHttpRoute( 
                name: "DefaultApi", 
                routeTemplate: "api/{controller}/{id}", 
                defaults: new { id = RouteParameter.Optional } 
            ); 
        }

【问题讨论】:

  • 您的控制器的名称是什么?还有你的路线配置是什么?

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


【解决方案1】:

由于您使用的是config.MapHttpAttributeRoutes();,您可以按如下方式使用Route Prefixes,因为您使用的是UrlHelper.Link Method,您需要设置Route Name

[RoutePrefix("api/Empleados")]   
public class EmpleadosController : ApiController {

    [Route("", Name="Empleados")]
    [HttpGet]
    public IHttpActionResult GettblEmpleados(int page, int pageSize) {
        var query = db.SPEmpleadosIntranet().ToList();

        var totalCount = query.Count();
        var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);

        var urlHelper = new UrlHelper(Request);
        var prevLink = page > 0 ? urlHelper.Link("Empleados", new { page = page - 1, pageSize = pageSize }) : "";
        var nextLink = page < totalPages - 1 ? urlHelper.Link("Empleados", new { page = page + 1, pageSize = pageSize }) : "";

        var results = query
        .Skip(pageSize * page)
        .Take(pageSize)
        .ToList();

        return Ok(query);
    }
}

【讨论】:

    【解决方案2】:

    你需要告诉方法它匹配到哪个 Http 方法。尝试使用以下属性来装饰它:

    [HttpGet]
    public IHttpActionResult GettblEmpleados(int page, int pageSize)
    {
    

    【讨论】:

      【解决方案3】:

      在您当前的 URL 中,您并不是指您的操作...

      控制器/动作/参数

      在你的 webapiconfig 中 -->

      routeTemplate: "api/{controller}/{action}/{id}"
      

      http://localhost:12929/api/Empleados/GettblEmpleados?page=0&pageSize=10

      【讨论】:

      • 分享你的路由配置
      • 我在global.asax上面粘贴了
      • 我不得不说这是一个 asp.net mvc 应用程序,我在其中托管 api 控制器,然后我想我在 global.asax 上遗漏了一些东西
      • 查看这个关于 WebApi 路由的信息页面 --> asp.net/web-api/overview/web-api-routing-and-actions/…
      • 请参阅 webapiconfig
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 2012-03-06
      • 2013-08-10
      • 1970-01-01
      相关资源
      最近更新 更多