我关注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',路由会是什么样的?
答案 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'格式的链接,因为它首先匹配路由表中的路由模式。