2016-08-19 1 views
1

기본적으로 임차인마다 '지역'이있는 사이트가 있습니다. 그래서 그것은 www.site.com/으로 나타나고 그것은 지역을 사용하여 그 그룹 페이지로 갈 것입니다.기본 경로가있는 임차인 지역 경로

사실 나는 지역 외의 기본 경로가 있으므로 www.site.com/에 갈 수 있으므로 실제 ~/Views/Home/Index 페이지로 연결됩니다. 그러나 www.site.com/Home/Index를 입력하거나 새 그룹을 만들려면 www.site.com/Group/Create 페이지를 만들면 존재하지 않는 지역으로 이동해야한다고 생각하는 경우 404 리소스를 찾을 수 없습니다. 그래서

 context.MapRoute(
      "Group_default", 
      "{group}/{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new[] { "TicketSystem.Areas.Group.Controllers" }); 

은 {그룹} 현재 방문하는 어떤 그룹 : 여기

는 RouteConfig.cs 여기

 routes.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new[] { "TicketSystem.Controllers" } 
     ); 

의 기본 경로는 영역에 대한 경로 설정입니다 해당 그룹의 일반 컨트롤러/작업으로 이동합니다. 그러나 기본 경로의 경우에도 여전히 지역 경로로 이동하는 것으로 보입니다.

나는 대체로있을 수 있다고 생각했다. 따라서 지역으로 가려고 시도 할 때 올바른 컨트롤러/액션을 찾을 수 없으면 다음 기본 경로를 확인합니다. 그래도 아무것도 찾을 수 없으면 404 오류 리소스를 찾을 수 없습니다. 비록 내가 정확하게 이것을하는 방법을 모르겠지만.

www.site.com/을 작동시키고 www.site.com/Home/Index가 작동하도록 허용하십시오.

+0

은'그룹 '값이 무엇입니까? 앱이나 임의의 문자열에서 가져온 영역 중 하나 일 수 있습니까? – Shyju

+0

@Shyju 영역의 그룹 값은 공백이없는 한 임의의 문자열이 될 수 있습니다. 영역을로드 할 때 그룹이 데이터베이스에 존재하는지 확인합니다. 따라서 www.site.com/testgroup 또는 www.site.com/othergroup 일 수 있으며 둘 다 실제 그룹 페이지로 이동해야합니다. – Insight

+0

기본적으로 단일 영역이 있습니다. 의례? 그룹이 URL에 있으면 해당 지역에서 그룹을 처리하기를 원하십니까? – Shyju

답변

1

/Home/Index에 액세스하려고 할 때 문제가 있습니다. 경로 엔진이 "집"으로 알지 못하면 컨트롤러 이름이나 그룹 이름을 의미했습니다!

이를 해결하기 위해 요청 URL의 그룹 값이 앱의 유효한 컨트롤러 이름인지 확인하는 맞춤 경로 제약 조건을 만들 수 있습니다. '예'인 경우 요청은 지역 노선 등록 정의에 의해 처리되지 않습니다.

public class GroupNameConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, 
         RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var asm = Assembly.GetExecutingAssembly(); 

     //Get all the controller names 

     var controllerTypes = (from t in asm.GetExportedTypes() 
      where typeof(IController).IsAssignableFrom(t) 
      select t.Name.Replace("Controller", "")); 
     var groupName = values["group"]; 
     if (groupName != null) 
     { 
      if (controllerTypes.Any(x => x.Equals(groupName.ToString(), 
                 StringComparison.OrdinalIgnoreCase))) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

지역 경로를 등록 할 때이 제약 조건을 등록하십시오.

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Group_default", 
      "{group}/{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new { anything = new GroupNameConstraint() } 


     ); 
    } 

이것은 당신이 당신의 컨트롤러 이름과 동일한 groupName을하지 않아도됩니다 가정 작동합니다 (예 : 홈)

+1

굉장 완벽하게 작동합니다! 사람들이 컨트롤러 이름과 같은 그룹 이름을 만들 수 없도록하는 간단한 점검을 추가 할 수 있습니다. 어렵지 않아야합니다. 처음으로 제약 조건을 확인하는 것은 내가 배우는 가장 좋은 방법은 실제로 그것들을 사용하는 것이다. 그리고 이제는 내 자신의 맥락에서 하나를 사용하고있다. 감사! – Insight

+0

프로파일 링을하는 사람들에게 '을 추가 할 수 있습니다. if (groupName.ToString(). Equals ("VSEnterpriseHelper.axd", StringComparison.OrdinalIgnoreCase)) {return false; }'프로파일 링 axd 파일이 그것이 그룹이라고 생각하는 대신 제대로 작동하도록 허용합니다. 아마도 이렇게 쉬운 방법 일 수 있지만 문제가 실제로 어디에서 발생했는지 알 수 있습니다. asmx 파일 같은 것을 원한다면. – Insight

관련 문제