2017-12-18 22 views
0

ASP.NET MVC 5でルーティングに問題があります。「Public」と「Admin」の2つのエリアを作成し、public/NewsController/index default siteをurl localhost/Exampleに設定します。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 } 
       ); 
      } 
     } 

登録します。WebUIが、今、私はT4MVCではlocalhost/Example.WebUI /管理... 私のコードを使用することはできません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エリアを除いて、すべてのルートURLがまったく同じであるという問題があります。 MVCは常に最初の一致するルートを使用し、それに続くすべてのルートを無視するので、正しい順序でルートを構成することと、ルートが必要なURL以外のURLと一致しないようにすることが重要です。この問題と考えられる解決方法は、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つのセグメントURLのすべてが一致しないようにする方法も必要です。上記はリテラルセグメントの使用を示していますが、Regex route constraintまたはCustom route constraintとのより高度なマッチングを行うことができます。

最後に、特定のエリアへのルート設定に必要な.DataTokens["area"] = "Admin"がありません(これは、AdminAreaRegistrationクラス内のルートを定義しない場合に必要です)。