2009-10-17 82 views
1

我正在關注Martijn Boland's 'Paging with ASP.NET MVC'。儘管有幫助,但卻引發了一些我不明白的問題。在ASP.Net中尋呼和路由MVC

馬亭說:

內部,尋呼機使用 RouteTable.Routes.GetVirtualPath()來渲染 URL的所以頁面的URL即可 通過路由被配置爲創建 好看的URL例如像 '/ Categories/Shoes/Page/1''而不是 '/ Paging/ViewByCategory?name = Shoes & page = 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 & page = 1'更改爲'/ Categories/Shoes/Page/1'?

回答

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將在「/分類/鞋/頁/ 1'格式返回鏈接,因爲它是第一個匹配的路由模式在路由表中。