2017-12-18 202 views
0

我在ASP.NET MVC 5中有一个路由问题。我创建两个区域“公共”和“管理”,我在URL localhost/Example中设置Public/NewsController/Index默认站点。 WebUI中,但现在我不能使用localhost/Example.WebUI /联系...... 我与T4MVC代码:ASP.NET MVC 5路由区域

AdminAreaRegistration.cs

public class AdminAreaRegistration : AreaRegistration 
    { 
     public override string AreaName 
     { 
      get 
      { 
       return "Admin"; 
      } 
     } 

     public override void RegisterArea(AreaRegistrationContext context) 
     { 
      context.MapRoute(
       "Admin_default", 
       "Admin/{controller}/{action}/{id}", 
       new { area = MVC.Admin, controller = MVC.Admin.Hierarchy.Name, action = MVC.Admin.Hierarchy.ActionNames.Index, id = UrlParameter.Optional }    
      ); 
     } 
    } 

PublicAreaRegistration.cs

public class PublicAreaRegistration : AreaRegistration 
     { 
      public override string AreaName 
      { 
       get 
       { 
        return "Public"; 
       } 
      } 

      public override void RegisterArea(AreaRegistrationContext context) 
      { 
       context.MapRoute(
        "Public_default", 
        "{controller}/{action}/{id}", 
        new { controller = MVC.Public.News.Name, action = MVC.Public.News.ActionNames.Index, id = UrlParameter.Optional } 
       ); 
      } 
     } 

注册Routes.cs

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { area = MVC.Public.Name, controller = MVC.Public.News.Name, action = MVC.Public.News.ActionNames.Index, id = UrlParameter.Optional }, 
       namespaces: new[] { "Example.WebIU.Areas.Public.Controllers" } 
      ); 

      routes.MapRoute(
       name: "MyRoute", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = MVC.Admin.Hierarchy.Name, action = MVC.Admin.Hierarchy.ActionNames.Index, id = UrlParameter.Optional }, 
       namespaces: new[] { "Example.WebIU.Areas.Admin.Controllers" } 
      ); 
     } 

而且Global.asax中

public class MvcApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 
      AutoMapper.Mapper.Initialize(cfg => cfg.AddProfile<AutomapperProfile>()); 
      AreaRegistration.RegisterAllAreas(); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
     } 
    } 

你能帮助我吗?

回答

0

问题是,除Admin区域外,您的所有路由网址都完全相同。 MVC将始终使用第一个匹配路由并忽略后面的每条路由,因此,以正确的顺序配置路由以及确保路由不匹配任何网址(除了它应该包含的网址之外)非常重要。这个问题和可能的解决方案最好在Why map special routes first before common routes in asp.net mvc?中描述。

最简单的解决方法是在URL中使用文字段以确保它只匹配特定的一组URL。

PublicAreaRegistration.cs

public class PublicAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
     get 
     { 
      return "Public"; 
     } 
    } 

    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Public_default", 
      "Public/{action}/{id}", 
      new { controller = MVC.Public.News.Name, action = MVC.Public.News.ActionNames.Index, id = UrlParameter.Optional } 
     ); 
    } 
} 

RegisterRoutes.cs

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.MapRoute(
     name: "MyRoute", 
     url: "MyRoute/{action}/{id}", 
     defaults: new { controller = MVC.Admin.Hierarchy.Name, action = MVC.Admin.Hierarchy.ActionNames.Index, id = UrlParameter.Optional }, 
     namespaces: new[] { "Example.WebIU.Areas.Admin.Controllers" } 
    ).DataTokens["area"] = "Admin"; 

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { area = MVC.Public.Name, controller = MVC.Public.News.Name, action = MVC.Public.News.ActionNames.Index, id = UrlParameter.Optional }, 
     namespaces: new[] { "Example.WebIU.Areas.Public.Controllers" } 
    ); 
} 

注意你也有MyRoute以错误的顺序登记。此路线必须放置在Default之前,以便它完全有效。如前所述,您还需要一种方法来确保并非所有3个网段网址都匹配。以上显示了使用文字段来做到这一点,但您可以使用Regex route constraintCustom route constraint进行更高级的匹配。

最后,您错过了将路线设置到特定区域所需的.DataTokens["area"] = "Admin"(如果您未定义AdminAreaRegistration类中的路线,则需要此路径)。