2017-12-18 228 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類中的路線,則需要此路徑)。