在ASP.Net MVC中进行分页和路由

时间:2009-10-17 18:01:03

标签: asp.net-mvc routing

我关注Martijn Boland's 'Paging with ASP.NET MVC'。虽然很有帮助但它提出了一些我不理解的问题。

Martijn说:

  

内部,寻呼机使用   RouteTable.Routes.GetVirtualPath()到   渲染网址,以便页面网址可以   通过路由配置来创建   好看的网址就好比如   '/ Categories / Shoes / Page / 1'而不是   “/寻呼/ ViewByCategory名称=鞋类及安培;页= 1'

这就是他所说的:

private string GeneratePageLink(string linkText, int pageNumber)
  {
   var pageLinkValueDictionary = new RouteValueDictionary(this.linkWithoutPageValuesDictionary);
   pageLinkValueDictionary.Add("page", pageNumber);
   //var virtualPathData = this.viewContext.RouteData.Route.GetVirtualPath(this.viewContext, pageLinkValueDictionary);
   var virtualPathData = RouteTable.Routes.GetVirtualPath(this.viewContext.RequestContext, pageLinkValueDictionary);

   if (virtualPathData != null)
   {
    string linkFormat = "<a href=\"{0}\">{1}</a>";
    return String.Format(linkFormat, virtualPathData.VirtualPath, linkText);
   }
   else
   {
    return null;
   }
  }

这是如何工作的?当我使用它时,virtualPathData.VirtualPath只返回一个代表路由表中第一个路由的url,最后是一个'page'参数,而不是一个代表当前上下文的url。

此外,如果将此'/ Paging / ViewByCategory?name = Shoes&amp; page = 1'更改为此'/ Categories / Shoes / Page / 1',路由会是什么样的?

1 个答案:

答案 0 :(得分:3)

我假设您有Paging控制器,并且此控制器具有ViewByCategory操作。

ViewByCategory看起来像:

public ActionResult ViewByCategory(string categoryName, int? page)
{
  ....
}

路由看起来像

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

    routes.MapRoute(
        "RouteByCategory",
        "Categories/{categoryName}/Page/{page}",
        new { controller = "Paging", action = "ViewByCategory" }
    );

    routes.MapRoute(
        "RouteByCategoryFirstPage",
        "Categories/{categoryName}",
        new { controller = "Paging", action = "ViewByCategory", page = 1 }
    );

    routes.MapRoute(
        "Default",                                              // Route name
        "{controller}/{action}/{id}",                           // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    );
}

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
}

GeneratePageLink将返回'/ Categories / Shoes / Page / 1'格式的链接,因为它首先匹配路由表中的路由模式。