全局 ASAX - ASP.NET MVC 无法以编程方式查找路由



我有以下一条路由,在我的global.asax中注册。

routes.MapRoute(
    "Home", // Unique name
    "", // Root url
    new { controller = "Home", action = "Index", 
        tag = string.Empty, page = 1 }
);

当我启动网站时,它会正确地选择这条路线。

现在,当我尝试以编程方式执行以下操作时,它将返回 NULL。

var pageLinkValueDictionary = 
    new RouteValueDictionar(linkWithoutPageValuesDictionary)
        {{"page", 2}};
VirtualPathData virtualPathData = 
    RouteTable.Routes.GetVirtualPath(viewContext, "Home"
        pageLinkValueDictionary);
// NOTE: pageLinkValueDictionary == 
//     Key: Action, Value: Index; Key: page, Value: 2

为什么会这样?

我的印象是它会找到 Home 路由,但附加任何未找到的值作为查询字符串项目?

更新

这仍然没有运气。另外,使用 MVC RC,我现在需要将 viewContext 更改为 veiwContext.RequestContext。它编译,但我仍然得到一个空结果。

更新 2

当我的路由没有page=1默认项时,会找到路由。例如。

routes.MapRoute(
        "Home",
        "",
        new { controller = "Post", action = "Index", tags = string.Empty }
    );

.. 和 RouteTable.Routes.GetVirtualPath 返回一个VirtualPathData实例。当我重新添加page=1(默认值(时,返回的VirtualPathData实例为空?

它返回 null 的原因是没有带有"页面"路由数据的路由。

您能稍微扩展一下您要实现的目标吗?如果要重定向到网址为/page/2 或/?page=2 的页面,则应使用 RedirectToRoute 或 RedirectToAction:

return RedirectToRoute("IndexDefault", new {page = "2"}); 

我认为你的路线应该是这样的:

route.MapRoute("theRoute", "{controller}/{action}/{tag}/{page}",
  new { controller="Post", action="Index", tag="", page=1 });

或者(取决于完整 URL 的外观(...

route.MapRoute("theRoute", "/{tag}/{page}",
  new { controller="Post", action="Index", tag="", page=1 });

这仍将匹配要 http://mysite.com/的请求,并转到上面定义的默认路由值。 但是现在,当您指定代码或页面时,您将获得所需的网址。

你应该看看Phil的路线测试器:

ASP.NET 路由调试器

相关内容

  • 没有找到相关文章

最新更新