2017-12-18 27 views
0

ASP.NET MVC 5에서 라우팅에 문제가 있습니다. "Public"과 "Admin"의 두 영역을 만들고 URL localhost/Example에 Public/NewsController/Index 기본 사이트를 설정합니다.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 } 
       ); 
      } 
     } 

등록 : UI를하지만 지금은 로컬 호스트/Example.WebUI/관리 ... 내 T4MVC와 코드를 사용할 수 없습니다

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" } 
      ); 
     } 

Routes.cs

그리고 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과 일치하지 않는지 확인해야합니다. 이 문제와 가능한 해결책은 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 클래스 내부에서 경로를 정의하지 않은 경우 필요합니다).