2011-01-31 4 views
3

사람들이 등록 할 수있는 사이트가 ~/pageSlug에 호스트하려는 사이트에서 자신의 페이지를 제공 할 수있는 영역이 있습니다. Global.asax에서 규칙을 적용하려고 시도했지만 ~/컨트롤러이 색인 작업에 직접 매핑 할 수있는 기본적인 기본 경로를 위반했습니다. userSlug 앞에 구분 기호를 넣을 수 없으므로 ~/p/pageSlug은 실제로 옵션이 아닙니다.어떻게 동적으로 ASP.NET MVC RouteTable에 추가 할 수 있습니까?

경로에 사용자 페이지를 추가하는 측면에서 App_Start의 페이지를 순환하여 RoutesTable에 명시 적으로 추가하고 있습니다. 이것은 정상적으로 작동하고 있으며, AppPool을 하루에 한 번 작업 할 수있을 정도로 길게 설정했습니다. 이렇게하면 사용자를 위해 24 시간 동안 '페이지를 실시간으로 처리'할 수있는 전환점을 남겨 둡니다.이를 해결하기 위해 노력하고 있습니다.

이상적으로, 사용자가 등록한 후에 RouteTable에 관련 경로를 동적으로 추가하는 것이 이상적입니다. 나는 이것을 시도했다 :

RouteTable.Routes.Add(
    RouteTable.Routes.MapRoute(
     toAdd.UrlSlug + "Homepage", 
     toAdd.UrlSlug, 
     new { controller = "Controller", View = "View", urlSlug = toAdd.UrlSlug } 
    ) 
); 

그러나 그것은 작동하지 않았다. 다른 곳에서는 솔루션을 찾을 수 없으며, 내 코드가 끔찍하게 순진하고 라우팅에 대한 이해가 부족하다는 것을 잘 알고 있습니다. 도움을주십시오!

+0

나는이 일을 해결하지만, 즉시 손에없는 코드를 수행하고하는 것은 내 자신의 질문에 대답의 에티켓 확실하지 않았다했습니다! 누구든지 후반 부분에 조언을 할 수 있다면 사람들에게 내가 어떻게 고쳐 주는지 알려주 게되어 기쁩니다. – jonsidnell

+2

질문에 답하고 올바른 것으로 표시하십시오. 이전 질문이지만 가능한 경우 솔루션을 게시 할 수 있습니까?완전성 및 사실 똑같은 문제가 있다는 사실 모두 : – Will

답변

0

동적으로 경로를 추가 할 수 있다고 생각하지 않습니다.

이 질문에 봐, 어쩌면 당신을 도울 것입니다 : ASP.NET MVC custom routing for search

+0

흠, 이것이 사실 일 수 있다고 생각하기 시작했습니다. 코드를 통해 디버깅하면 RouteTable.Routes.Add()처럼 하지만 요청주기에만 해당됩니다. 앱 전반에 걸쳐 사용되는 RouteTable에이를 유지하지 않는 것 같습니다. – jonsidnell

+0

@jsidnell - 지역의 역동적 인 생성 (새로운 경로로 귀결되는)을 요구하는 사람들을 기억하고 그 대답은 '지원되지 않습니다'. 내 멀티 테넌트 응용 프로그램에 대한 슬러그 및 사용자 지정 mvc 처리기 슬러그 값을 데리러 일반적인 경로를 만드는 결국 –

2

당신이 경로 제약 조건을 사용하여, 이것을 시도합니다. 모든 사용자의 목록을 얻고 Global.asax.cs에

public class UserPageConstraint : IRouteConstraint 
{ 
    public static IList<string> UserPageNames = (Container.ResolveShared<IUserService>()).GetUserPageNames(); 

    bool _IsUserPage; 
    public UserPageConstraint(bool IsUserPage) 
    { 
     _IsUserPage = IsUserPage;    
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     if (_IsUserPage) 
      return UserPageNames.Contains(values[parameterName].ToString().ToLower()); 
     else 
      return !UserPageNames.Contains(values[parameterName].ToString().ToLower()); 
    } 
} 

그런 다음 목록의 항목과 일치하는 선택한 경로를 제약 조건, 사용자의 경로를 설정 다음과 같이

routes.MapRoute("UserHome", "{userPage}", new { controller = "UserPageController", action = "Index" }, new { userPage = new UserPageConstraint(true) }); 

들어 위의 라우트에서 UserPageController의 'index'액션에서 userPage가 매개 변수로 사용됩니다.

userPage 홈과 관련된 다른 경로의 경우 그에 따라 경로를 추가 할 수 있습니다. 예를 들어 userdetails 페이지 경로는 다음과 같이 추가 할 수 있습니다.

routes.MapRoute("UserHome", "{userPage}/mydetails", new { controller = "UserPageController", action = "Details" }, new { userPage = new UserPageConstraint(true) }); 

이 방법을 사용할 수 있습니다.

+0

매우 유용합니다. CMS 유스 케이스의 DB에서로드 된 내용을 가진 동적 "페이지"컨트롤러를 원했던 비슷한 시나리오에서이 작업을 수행 할 수있었습니다. – Dan

1

Route Magic 과 같은 외부 라이브러리를 사용하지 않고도 동적으로 라우트를 추가하는 대신 최근에 실현했습니다. 아키텍처를 올바르게 설계하면 Routing Constraint 만 있으면 충분할 것으로 확신합니다. 내 응용 프로그램이 작기 때문에 구현 된 컨트롤러를 하나만 사용하고 나머지는 동적으로 만듭니다 (현재 실험 중이지만 작동 할 것입니다).

고려 다음과 같은 경로

routes.MapRoute(
    name: "ContactRequests_Operations", 
    url: "ContactRequests-{operation}", 
    defaults: new { controller = "Content", action = "Module_Direct", id = "ContactRequests" , operation = "Get" } 
); 

routes.MapRoute(
    name: "Messages", 
    url: "Messages", 
    defaults: new { controller = "Content", action = "Direct", id ="Messages" } 
); 
관련 문제