C# GetVirtualPath ForArea返回错误的VirtualPath
我正在使用Martijn Bolands,我对GetVirtualPathForArea方法有一个问题 我有两页:/Page1和/Page2 我已经为/Page1设置了映射路由,并以/Page1Name的形式访问C# GetVirtualPath ForArea返回错误的VirtualPath,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我正在使用Martijn Bolands,我对GetVirtualPathForArea方法有一个问题 我有两页:/Page1和/Page2 我已经为/Page1设置了映射路由,并以/Page1Name的形式访问 routes.MapRoute( "Page1 name", // Route name "Page1Name", // URL with parameters new { controller = "ContollerName", action
routes.MapRoute(
"Page1 name", // Route name
"Page1Name", // URL with parameters
new { controller = "ContollerName", action = "ActionName" } // Parameter defaults
);
如果我尝试从Page1Name页面获取Vitrual路径,它会给出正确的路径
但是!!如果我尝试从page2获取虚拟路径,它会再次给出Page1名称
我还没有为Page2设置任何路由,如果这样做,那么在Page1中我将获得Page2的VirtualPath
调用和方法
该调用通过HtmlHelper进行,如下所示
public static HtmlString Pager(this HtmlHelper htmlHelper, int pageSize, int currentPage, int totalItemCount, string actionName, RouteValueDictionary valuesDictionary, string controllerName) {
if (valuesDictionary == null) {
valuesDictionary = new RouteValueDictionary();
}
if (actionName != null) {
if (valuesDictionary.ContainsKey("action")) {
throw new ArgumentException("The valuesDictionary already contains an action.", "actionName");
}
valuesDictionary.Add("action", actionName);
}
var pager = new Pager(htmlHelper.ViewContext, pageSize, currentPage, totalItemCount, valuesDictionary, null, controllerName);
return pager.RenderHtml();
}
这来自RenderHtml()方法
它从htmlHelper获取viewContext,这是获取virtualPath的调用
var pageLinkValueDictionary = new RouteValueDictionary(linkWithoutPageValuesDictionary) { { "page", pageNumber } };
var virtualPathForArea = RouteTable.Routes.GetVirtualPathForArea(viewContext.RequestContext, pageLinkValueDictionary);
这是一个已知的问题吗?我把东西放错地方了吗
谢谢,如果您有任何意见,我将不胜感激。通常情况下,注册的路线可能看起来像
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "ControllerName", action = "ActionName", id = UrlParameter.Optional } // Parameter defaults,
);
这意味着执行Url.Action(“Index”,“Home”,new{id=1})
将导致Url/Home/Index/1
;{controller}/{action}/{id}
是用于解释请求(要使用哪个控制器、操作和参数)和生成url的占位符
如果查看定义的路由(如果它是唯一的路由,或定义为第一个路由),无论您使用Url.Action(..)
执行什么操作,它都将返回/Page1Name
如果您想按照提供的链接中的方式进行操作
在内部,寻呼机使用RouteTable.Routes.GetVirtualPath()呈现url,以便可以通过路由配置页面url,以创建美观的url,例如/Categories/Shoes/page/1
,而不是/Paging/ViewByCategory?name=Shoes&page=1
然后您可以注册您的路线,如:
routes.MapRoute(
"PagingRoute", // Route name
"Categories/{type}/Page/{page}", // URL with parameters
new { controller = "PagingControllerName",
action = "Index",
type = UrlParameter.Optional,
page = UrlParameter.Optional } // Parameter defaults,
);
routes.MapRoute("Page1 name", "{action}/{page}",
new { controller = "Paging", action = "Page1Name", page = UrlParameter.Optional },
);
PagingController中的匹配方法是
public ActionResult Index(string type, int? page) { // do something}
更新 如果您使用的是Martijn Bolands寻呼机,请查看他映射/注册的第二条路线:
routes.MapRoute("SimplePaging", "SimplePaging/{page}",
new { controller = "Paging", action = "Index", page = UrlParameter.Optional },
new[] { "MvcPaging.Demo.Controllers" });
那么您的页面应该大致相同(即添加UrlParameter页面)。但这意味着您的url将始终看起来像/Page1Name/[pagenumber]。另一方面,如果Page1Name是您的实际操作,您应该定义您的路线,如下所示:
routes.MapRoute(
"PagingRoute", // Route name
"Categories/{type}/Page/{page}", // URL with parameters
new { controller = "PagingControllerName",
action = "Index",
type = UrlParameter.Optional,
page = UrlParameter.Optional } // Parameter defaults,
);
routes.MapRoute("Page1 name", "{action}/{page}",
new { controller = "Paging", action = "Page1Name", page = UrlParameter.Optional },
);
微软回复: 您在这里提到的行为实际上是“按设计”的,如果路由URL(例如您的第一条路由:FirstPage)没有参数、默认值和约束,那么对RouteTable.Routes.GetVirtualPathForArea()的调用将匹配此路由(当它到达该路由时,它将尝试按照添加的顺序逐个匹配该路由)。 一般的解决方法是将其中一个条件设置为false或使用命名路由
您可以在Phil Haack的博客文章中了解更多信息:生成的url是/Page1Name?page={number}。我无法为类似的内容设置路由,因为它包含“?”。Ν尽管我设置了路径Page1Name/Page/{Page},但它具有相同的行为。这是您映射的唯一路径吗?或者你有更多的路线映射?方法调用看起来如何获得虚拟路径?我创建了一个新的mvc 3项目,并添加了两个路由,一个用于名为HomePageName的Home controller,另一个用于名为AccountPageName的Account controller。我还在account controller中添加了一个名为Index的新视图。如果您试图获取虚拟路径,您将获得错误的值[var\u virtualPath=RouteTable.Routes.getvirtualpathforea(null,null);]这就成功了。但是这是一个硬代码修复,在GetVirtualPath()方法中返回错误的值有点奇怪。我希望返回正确的值。无论如何,非常感谢您的帮助。它不是硬编码的,事实上,{action}使它变了@Url.Action(“Page1Name”,new{page=3})给出
/Page1Name/3
,@Url.Action(“Page2Name”,new{page=4})给出/Page2Name/4
。action=“Page1Name”
仅定义默认操作,因此@Url.action(new{page=2})将给出/Page1Name/2
。