Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GetVirtualPath ForArea返回错误的VirtualPath_C#_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

C# GetVirtualPath ForArea返回错误的VirtualPath

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

我正在使用Martijn Bolands,我对GetVirtualPathForArea方法有一个问题

我有两页:/Page1和/Page2

我已经为/Page1设置了映射路由,并以/Page1Name的形式访问

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