【问题标题】:How To do Routing For Pagination in ASP.NET MVC 5如何在 ASP.NET MVC 5 中为分页进行路由
【发布时间】:2016-10-11 04:39:16
【问题描述】:

我正在为 ASP.NET MVC 5 中的应用程序进行分页,并停留在分页的路由上。以下是我尝试使用的格式:

<a href="~/Home/page/1)">Next</a>

目前,它适用于以下情况:

<a href="~/Home?page=1">Next</a>

在 RouteConfig 文件中,我设置了以下路由:

public static void RegisterRoutes(RouteCollection routes)
    {
        //routes.RouteExistingFiles = true;
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute( //Route For The Pagination
            "Home",
            "Home/page/{page}",
             new { controller = "Home", action = "Index" }
       );

        routes.MapRoute( //Default Route
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

控制器:

    public ActionResult Index(int? page)
    {
        MainDbContext db = new MainDbContext();

        var listItems = new List<List>();

        if (User.Identity.IsAuthenticated)
        {
            listItems = (db.Lists.ToList());
        }
        else
        {
            listItems = (db.Lists.Where(m => m.Public == "Yes").ToList());
        }

        var pager = new Pager(listItems.Count(), page);

        var viewModel = new List
        {
            Items = listItems.Skip((pager.CurrentPage - 1) * pager.PageSize).Take(pager.PageSize).ToList(),
            Pager = pager
        };

        return View(viewModel);
    }

我不确定我是否做对了。但是现在,当我运行应用程序时,对于分页部分,它显示此消息“Server Error in '/' Application - The resource cannot be found”。我是否需要配置其他任何东西并期待专家的建议。谢谢。

【问题讨论】:

  • 能贴出处理寻呼路由的控制器吗?
  • 我已经编辑了帖子。我希望,您询问了上述处理分页的控制器。如果我对 ASP.NET MVC 完全陌生,请告诉我是否遗漏了什么。谢谢。
  • 我认为&lt;a href="~/Home/page/1)"&gt;Next&lt;/a&gt; 中的) 是错字?否则,您显示的代码将正常工作。这些是唯一的路线吗?它们是否按照您显示的顺序?
  • 是的。它们的顺序如图所示。基本上我在前端使用剃刀进行分页,如下所示:@Html.ActionLink("Next", "Index", "Home", new { page = (Model.Pager.CurrentPage + 1) }, null)甚至尝试过这个:Next。我对此有点困惑。后端还有什么要配置的吗?我希望您在这方面提出建议,并尝试了下面提供的解决方案。但没有奏效。谢谢。

标签: asp.net-mvc asp.net-mvc-5 pagination routing


【解决方案1】:

为了使寻呼的路由规则起作用,您需要定义不同的操作。

例如:

routes.MapRoute( //Route For The Pagination
    "Home",
    "Home/page/{page}",
    defaults: new { controller = "Home", action = "PagedIndex" }
    );

然后,您在HomeController 内部实现PagedIndex 操作。

public ActionResult PagedIndex(int? page)
{
    // code here to build your model
    return View("Index", viewModel);
}

您还需要将return View(viewModel); 更改为return View("Index", viewModel);。否则,它将尝试运行PagedIndex 视图。

编辑:添加整个文件:

App_Start/RouteConfig.cs

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute( //Route For The Pagination
            "Home",
            "Home/page/{page}",
            defaults: new { controller = "Home", action = "PagedIndex" }
            );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Controllers/HomeController.cs

    public ActionResult Index()
    {
        Models.Home.Index model = new Models.Home.Index();

        return View("Index", model);
    }

    public ActionResult PagedIndex(int? page)
    {
        Models.Home.Index model = new Models.Home.Index();
        model.page = page ?? 0;

        return View("Index", model);
    }

    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }

    public ActionResult Contact()
    {
        ViewBag.Message = "Your contact page.";

        return View();
    }
}

模型/Index.cs

// You won't need this, it is just a mock model I created to test the code
namespace SOQuestion.Models.Home
{
    public class Index
    {
        public int page { get; set; }

        public Index()
        {

        }
    }
}

Views/Home/Index.cshtml

@model SOQuestion.Models.Home.Index

@{
    ViewBag.Title = "Home Page";
}

<div class="row">
    <div class="col-md-12">
        <h2>This is the <b>Index</b> view</h2>
        <p>
            Current index is: <b>@Model.page</b>
        </p>
        <p>
            @if (Model.page > 0)
            {
                <a class="btn btn-info" href="/Home/Page/@(Model.page - 1)">Previous</a>
            }

            <a class="btn btn-info" href="/Home/Page/@(Model.page + 1)">Next</a>
        </p>
    </div>
</div>

【讨论】:

  • 试过但没用。我正在使用 HomeController 并在同一个控制器中实现了您的建议。
  • 您是否也更改了路由规则(例如action = "PagedIndex" 而不是action = "Index")?
  • 是的并创建了动作。有没有其他方法可以获得这种格式: Next 我的意思是在控制器中?顺便说一句,为什么我们需要另一个动作来这样做?
  • 嗯......事情是我在发布之前尝试了这段代码,并且它有效。分页的路由规则是否在默认规则之前?
  • 是的。它是。请参阅我在视图中使用它:Next。那么它会产生任何冲突吗?每当我运行项目时,它都会显示:'/'应用程序中的服务器错误 - 找不到资源'。
猜你喜欢
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 2015-12-09
  • 2015-04-06
相关资源
最近更新 更多