2010-01-20 2 views
4

여기 내 딜레마가 있습니다. 나는 일련의 경로를위한 출발점으로 정의하기 위해 사용하고자하는 엔티티 컬렉션을 가지고있다. 예를 들어 내 사이트의 모든 사용자에게 mydomain.com/username 형식의 자체 하위 사이트를 제공 한 다음 모든 UserController 작업을 중단해야합니다. 나는 "인덱스", "프로필"과 "바이오"와 같은 액션 메소드와 "UserController"을 가지고ASP.NET MVC에서 많은 경로를 동적으로 생성하는 것은 완전히 잘못된 생각입니까?

: 여기

내가 뭐하는 거지의 거친 예입니다. RegisterRoutes에서

public ActionResult Profile(int UserID) 
{ 
    User u = User.SingleOrDefault(u => u.UserID == UserID); 
    return View(u); 
} 

() 메소드,이 작업을 수행합니다

foreach (User user in User.Find(u => u.Active == true)) 
{ 
    routes.MapRoute(
     "", 
     user.UserName + "/{action}", 
     new { controller="User", action="Index", UserID=user.UserID } 
    ); 
} 

이 작동하고가 내가 원하는대로 정확하게 작동합니다

domain.com/[username]/Profile 
domain.com/[username]/Bio 

지금 유효한 작업 경로입니다 , 각 사용자가 자신의 경로를 얻으므로 Controller의 메소드 매개 변수로 UserID를 가져올 수 있습니다. 또한 기본 경로는 계속 작동합니다. 예.

내 질문은이 미친 짓인가? 시스템의 모든 사용자에 대한 경로 테이블에 항목을 생성합니다. 얼마나 많은 경로가 너무 많습니까? 10 명 이상의 사용자가있는 경우 내 서버를 죽입니까? 50? 1000?

미친 경우 어떻게해야합니까?

미리 감사드립니다. 나는 하이브 마인의 의견을 기다리고 있습니다.

답변

10

내 마음에 당신의 접근 방식에 대한 우려가 많이 있습니다. 누군가 다른 컨트롤러 이름 중 하나와 일치하는 사용자 이름을 가지고 있다면 어떻게 될까요? 당신은 결코 그 컨트롤러를 부를 수 없을 것입니다. 또한 라우팅 시스템은 모든 경로를 순차적으로 테스트하므로 수천 개의 경로가 URL 생성 (예 : Url.Content() 또는 Route.GetVirtualPath())을 포함하여 라우팅 조회 속도를 늦출 수 있습니다.

당신은

/{username}/{action} 

을하고 매개 변수의 일환으로 사용자 이름을 통과하지 수 있습니까? 모든 경로가 동일한 컨트롤러 및 작업 방법으로가는 경우 각 사용자의 경로 생성 지점은 무엇입니까?

사용자 컨트롤러와 일치해야하는 경우 consider implementing a custom route constraint. 이 링크는 컨트롤러 매개 변수와 일치해야하는 값 목록을 만드는 예제를 제공하지만 Action 메서드 이름에 대해 쉽게 수행 할 수 있습니다. 또는 사용자 지정 제약 조건 코드가 데이터베이스에서 사용자 이름을 조회하여 일치하는지 확인할 수 있습니다.

+0

너무 기본 경로와 일치할까요? 나는 그 부분을 명확하게하지 않았다고 생각한다. – obliojoe

+0

그냥 경로를 제약하십시오. 나는 도움이 될 훌륭한 글에 대한 링크를 추가했습니다. – womp

+0

팁 주셔서 감사. 나는 오늘 경로 제약을 들여다보고 그들이 나를 위해 일하는 지보기로 할 것입니다. 내 조사 결과를 여기서 다시보고 할게. 또한 - 사용자 이름/컨트롤러 충돌에 대해 걱정하지 않아도됩니다 (내 프로젝트는 제 질문에서 사용한 예제와 다릅니다).하지만 라우팅 시스템이 많은 수의 항목을 처리하는 방법에 대한 구체적인 정보를 주로 찾고있었습니다. 경로 테이블에. Thnaks. – obliojoe

0

제한 사항은 확실하지 않지만 라우팅 시스템은 각 사용자마다 하나가 아닌 하나의 경로로이 작업을 수행 할 수 있도록 만들어졌습니다. 자신이 될 것이다 기반으로

아주 간단한 예 :

routes.MapRoute(
     "", 
     "{UserName}/{action}", 
     new { controller="User", action="Index", UserID=user.UserID } 
    ); 
+0

기본 경로와 충돌이 발생합니까? 나는 내 질문에 대해 더 분명히해야한다고 생각한다. 이 방법으로 하위 사이트를 만들었지 만 기본 {controller}/{action}/{id} 경로도 유지합니다. – obliojoe

2

는 다른 방법이 MapRoute()에 제약을 사용하여보고 될 것이다. routes.MapRoute("", "{UserName}/{action}", new { controller="user", action="Index", UserID=user.UserID}); 같은 값을 유지하고 UserName이 특정 형식이나 목록에 있어야한다는 조건을 추가하십시오.

성능이 더 좋을지는 모르지만 많은 (거의 동일한) 경로를 등록하는 것의 대안입니다. 제약 조건 때문에 기본 경로와 충돌하지 않습니다.이 경로는 어쨌든 마지막 MapRoute() 호출이어야하므로 먼저 평가됩니다.

관련 문제