2009-11-12 4 views
1

twitter.com/help를 만들뿐만 아니라 동적 페이지 (account/viewuser 사용)로 이동하려면 twitter.com/rob을 만들려고합니다. 도움말 페이지 (도움말/색인).asp.net MVC 경로를 사용하여 Twitter 스타일 홈페이지를 만드는 방법

controller/action/id가 모두 선택 사항이기 때문에 기본 경로 처리기가 항상 ID를 컨트롤러로 선택하기 때문에 아래 코드가 어느 순서로든 작동하지 않습니다.

웹 사이트의 모든 페이지를 global.asax.cs에 정의하지 않고이를 수행 할 수있는 방법이 있습니까?


 routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

     routes.MapRoute(
      "UserHomepage",            // Route name 
      "{id}",              // URL with parameters 
      new { controller = "Account", action = "ViewUser", id = "" } // Parameter defaults 
     ); 

답변

2

당신이 기본 전에 두 번째 경로 ("UserHomePage")를 넣을 수 있습니다. 경로는 코드에 표시된 순서대로 평가됩니다.

즉, 현재 http://yoursite/http://yoursite/Home/Index으로 이동하고 제안 된 변경 사항을 적용하면 http://yoursite/Account/ViewUser으로 바뀝니다 (트위터와 관련이 없음). 원하는 동작을 결정하고 그에 따라 경로를 설계해야합니다.

+0

이것은 내 첫번째 생각 이었지만, 당신이 말했듯이, 홈페이지는 죽습니다. 트위터는 내가 원하는 행동의 한 예입니다. –

0

사용자 계정 경로를 추가하기 전에 none 사용자 경로를 추가 할 수 있습니다. 예

routes.MapRoute(
      "About",            
      "About/{id}",              
      new { controller = "About", action = "Index", id = "" } 
     ); 

routes.MapRoute(
      "Home",            
      "About/{id}",              
      new { controller = "Home", action = "Index", id = "" } 
     ); 

routes.MapRoute(
     "UserHomepage",            
     "{id}",              
     new { controller = "Account", action = "ViewUser", id = "" } 
    ); 
+0

안녕하세요 Carl - 모든 컨트롤러를 정의해야합니다. 이것은 나의 백업 계획이다! –

0

"UserHomepage"경로를 먼저 넣으십시오. 그런 다음 @Felix가 위에 설명했던 것과 같이해야합니다. 가능한 한 많이 끝까지 기본 경로를 만드십시오.

하지만 그 까다 롭습니다. 사용자가 제공 한 것이 컨트롤러 이름 인 경우에도 해당 경로가 트리거되기 때문에 제약 조건을 추가해야합니다. 예 :

http://yoursite.com/home이 있으면 기본 경로에 정의 된대로 "집/색인"으로 이동해야합니다. 그러나 UserHomepage 경로가 기본값보다 먼저 나오므로 우리가 기대하는 바가 일어나지 않고 대신 http://yoursite.com/home이 "account/viewuser/home"로 이동하여 id를 home으로 처리합니다.

이 문제에 대한 해결책은 제약 조건을 정의하는 것입니다. 내가 무슨 짓을

은 ID가 목록에 표시되어있는 경우 제약이 제약

routes.MapRoute(_ 
      "UserHomepage", _ 
      "{id}", _ 
      New With {.controller = "Case", .action = "FriendlyName"}, _ 
      New With {.id= New UserNameConstraint()} _ 
     ) 

이 경로는 이제 무시됩니다 포함하도록 경로를 변경 정의한 후 제약 클래스를

Public Class UserNameConstraint 
    Implements IRouteConstraint 

    Public Function Match(ByVal httpContext As System.Web.HttpContextBase, ByVal route As System.Web.Routing.Route, ByVal parameterName As String, ByVal values As System.Web.Routing.RouteValueDictionary, ByVal routeDirection As System.Web.Routing.RouteDirection) As Boolean Implements System.Web.Routing.IRouteConstraint.Match 
     Dim list As New List(Of String) 
     list.Add("home") 'List of controller names 

     For Each item In list 
      If values("id").ToString() = item Then 
       Return False 
      End If 
     Next 

     Return True 
    End Function 
End Class 

을 정의하다 제약 조건.

그게 전부입니다. 당신이 이해하기를 바랍니다. :)

+0

잠시 시간을내어 주위를 둘러보세요. 나는 최소한의 구성을 정말로 얻으려고 노력하고있다. 추가 정보 : routes.MapRoute ( "Homepage", // 경로 이름 "", // 매개 변수가있는 URL new {controller = "Home", action = "Index", id = ""}// 매개 변수 기본값 ); –