2013-11-23 83 views
0

下面的代码:这些路线为什么匹配?

<li>@Html.ActionLink(metaTapp.Nav_About, "Mayla", "About")</li> 
           <li>@Html.ActionLink(metaTapp.Nav_Support, "Support", "About")</li> 
           <li>@Html.ActionLink(metaTapp.Nav_Exchange, "Index", "Exchange")</li> 
           <li>@Html.ActionLink("Post Rfq", "Create", "Rfq")</li> 

是生产以下链接:

<li><a href="/Upload/Image?action=Mayla&amp;controller=About">About</a></li> 
           <li><a href="/Upload/Image?action=Support&amp;controller=About">Support</a></li> 
           <li><a href="/Upload/Image?action=Index&amp;controller=Exchange">Exchange</a></li> 
           <li><a href="/Upload/Image?action=Create&amp;controller=Rfq">Post Rfq</a></li> 

我的全球应用开始看起来是这样的:

protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 
      UploadRouteConfig.RegisterRoutes(RouteTable.Routes); 
      LocalizationConfig.RegisterRoutes(RouteTable.Routes); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 
      DatabaseFactory.SetDatabaseProviderFactory(new DatabaseProviderFactory()); 
     } 
    } 

UploadRouteConfig.RegisterRoutes:

public static void RegisterRoutes(RouteCollection routes) 
    { 

     routes.MapRoute("Upload", "Upload/Image", null).RouteHandler = new UploadMvcRouteHandler(); 
    } 

LocalizationConfig.RegisterRoutes

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.MapRoute(
      "Account", // Route name 
      "Account/{action}", // URL with parameters 
      new { controller = "Account", action = "Index" } // Parameter defaults 
    ); 

    routes.MapRoute(
     "RfqCategory", 
     string.Format("{{{0}}}/Rfq/CategoryFilter/{{category}}", Constants.ROUTE_PARAMNAME_LANG), 
     new { controller = "Rfq", action = "CategoryFilter", category = Guid.Empty.ToString() } 
    ); 

    routes.MapRoute(
     Constants.ROUTE_NAME, 
     string.Format("{{{0}}}/{{controller}}/{{action}}/{{rfqid}}", Constants.ROUTE_PARAMNAME_LANG), 
     new { controller = "About", action = "Home", rfqid = "00000000-0000-0000-0000-000000000000" } 
    ); 
} 

RouteConfig.RegisterRoutes:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.MapRoute("TappDefault", "{controller}/{action}/{id}", new { controller = "About", action = "Home", id = UrlParameter.Optional } 
     ); 

我无法理解的上传是如何被匹配到的一切。如果路由没有以Upload/Image开头,它应该通过localconfig路由?

+0

尝试定义你的'LocalizationRoutes'首先在'UploadROute'之前 – WannaCSharp

+0

这不会/不会工作,因为上传会被解释为语言环境。我也不想让它工作,但要理解它为什么不起作用。我现在的理解是,我做得很好,所以显然不是,但我需要知道为什么我今后可以“做得更好”。 – rism

回答

1

好的,所以我的问题的简短答案是,我应该使用RouteLink时呈现ActionLinks。 ActionLink将根据路由表条目执行匹配,这似乎是我想要的,但因为我使用的是静态Url:

"Upload/Image" 

每个url都匹配。为什么?因为路由不是过滤器。路由通过提供路由值匹配到URL的段的参数的工作,但由于:

"Upload/Image" 

没有参数即{控制器}然后技术上一切都匹配。 RouteLink上tyhe pother手让我来指定渲染链接时要使用的路线:

@Html.RouteLink(
linkText: "route: Home", 
routeName: "TappDefault", 
routeValues: new {controller="About", action="Home"} 
) 

..

从专业ASP.NET.MVC4(乔恩·加洛韦,菲尔哈克,布拉德·威尔逊,K斯科特·艾伦)

页232第9章路由:

让我们假设你在开头添加以下页面路径您的路由列表,以便URL/static/url由 页面处理/aspx/SomePage.aspx:

routes.MapPageRoute(“new”,“static/url”,“〜/ aspx/SomePage的.aspx“);

请注意,您不能将此路由放在RegisterRoutes方法内的路由 列表的末尾,因为它永远不会匹配 传入的请求。为什么不呢?那么,请求/静态/网址 将与默认路由相匹配,并且绝不会通过 到达新路由的路由列表。因此,您需要 将此路线添加到 默认路线之前的路线列表的开头。

注意此问题不适用于使用Web窗体进行路由。有许多情况下,您可能会路由到非ASP.NET MVC路由 处理程序。

将此路线移动到已定义的路线列表的开头似乎是一个天真无邪的变化 ,对吗?对于传入的请求,此 路由将仅匹配与/ static/url完全匹配的请求,但 不匹配任何其他请求。这正是你想要的。但是 生成的URL呢?如果你回头看看 两个调用Url.RouteLink的结果,你会第二科幻,这两个网址被打破:

/url?controller=section&action=Index&id=123 

/static/url?controller=Home&action=Index&id=123 

这进入一个微妙的行为的路由,这是毫无疑问的 有点边缘的情况下,但是有人从 不时碰到的东西。

通常,当您使用路由生成URL时,您提供的路由值 用于“填入”本章前面讨论的 的URL参数。

当您使用URL {controller}/{action}/{id}的路线时, 预计会为 生成一个URL时提供控制器,操作和ID的值。在这种情况下,因为新路由没有 任何URL参数,所以它匹配每个URL生成尝试,因为在技术上 “为每个URL参数提供了一个路由值”。它 恰好没有任何网址参数。这就是为什么所有 现有URL都被破坏的原因,因为现在每一个生成URL 的尝试都会匹配这条新路线。

这可能看起来像一个大问题,但这个方法非常简单。所有路线都使用 名称,并在 生成URL时始终使用路线名称。大多数情况下,让路由选择你想要用来生成一个URL的路由,实际上会让它变为 的机会,这对于强迫控制的畸形开发者来说并不是很合适。当生成一个 URL时,您通常会确切知道您要链接到哪条路线,因此您可以按名称指定它。如果您需要使用 非命名路由并且完全将URL生成保留至 路由,我们建议您编写单元测试,以验证应用中路由和URL生成的预期行为。

指定路由的名称不仅避免歧义,但它 甚至可能勉强维持位以每个formance改进,因为 路由引擎可以直接到指定的路线和尝试使用 它网址代。

在前面的示例中,如果生成了两个链接,则以下 会更改此问题。我们更改了代码以使用命名参数 明确了更改的内容。 @Html。RouteLink(LINKTEXT: “路线: 测试”,routeName: “测试”,routeValues:新{控制器= “节”, 行动= “指数”,ID = 123})