2014-05-25 2 views
1

내가 Asp.Net MVC 4사용자 정의 URL 라우팅 Asp.Net MVC 4

주에서이 URL (http://www.domain.com/friendly-content-title)처럼 할 수있는 방법 :이 매개 변수는 항상 동적입니다. URL은 다를 수 있습니다. "friendly-content-title"

사용자 지정 특성을 사용하려고하지만 ActionResult에서이 (friendly-content-title) 매개 변수를 catch하지 않습니다.

조회수 :

  • 홈/색인
  • 홈/비디오

ActionResult :

// GET: /Home/   
    public ActionResult Index() 
    { 
     return View(Latest); 
    } 

    // GET: /Home/Video   
    public ActionResult Video(string permalink) 
    { 
     var title = permalink; 
     return View(); 
    } 

RouteConfig :

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Home Page", 
      url: "{controller}/{action}", 
      defaults: new { controller = "Home", action = "Index" } 
     ); 

     routes.MapRoute(
      name: "Video Page", 
      url: "{Home}/{permalink}", 
      defaults: new { controller = "Home", action = "Video", permalink = "" } 
     ); 

    } 

catch to url (/ friendly-content-title)에 대해 어떻게해야합니까?

답변

4

특성 라우팅을 사용하려면 구성 중에 MapMvcAttributeRoutes를 호출하십시오. 다음은 코드를 잘라낸 것입니다.

 public class RouteConfig 
     { 
      public static void RegisterRoutes(RouteCollection routes) 
      { 
       routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
       routes.MapMvcAttributeRoutes(); 
      } 
     } 

MVC5에서 우리는 속성 라우팅과 규칙 기반 라우팅을 결합 할 수 있습니다. 다음은 코드를 잘라낸 것입니다.

route 매개 변수에 물음표를 추가하여 URI 매개 변수를 선택 사항으로 만드는 것은 매우 쉽습니다. form parameter = value를 사용하여 기본값을 지정할 수도 있습니다. here 전체 기사입니다.

3

마커 키워드가 필요합니다. URL이 friendly-content-title 인 동적 URL로 처리되어야한다고 분명하게 말합니다. 나는 키워드 video를 사용하는 것이 좋습니다 것이고, 다음이 경로의 매핑 될 것이다 : VideoPage이 (아래이 같은) 과 같이 처리됩니다 첫 번째, 모든 URL로 선언되어 있기 때문에, 지금

routes.MapRoute(
    name: "VideoPage", 
    url: "video/{permalink}", 
    defaults: new { controller = "Home", action = "Video", permalink = "" } 
); 
routes.MapRoute(
    name: "HomePage", 
    url: "{controller}/{action}", 
    defaults: new { controller = "Home", action = "Index" } 
); 

동적 : 다른 (controllerName/ActionName) 동안

// these will be processed by Video action of the Home controller 
domain/video/friendly-content-title 
domain/video/friendly-content-title2 

표준 방법을

+0

시도해보십시오. 그러나 나는 그것을 원하지 않는다. – mstfcck

+0

나는 이해한다 ... 당신은'video /'부분을 좋아하지 않는다. 그러나 나는 이것이 가장 적합한 방법이라고 말할 것이다. 나는 말할 것이다. 왜? 이 키워드가 없으면 URL 도메인/home이 컨트롤러 또는 동영상 이름 (홈) 인 경우 라우팅 메커니즘에서 절대 확신 할 수 없기 때문입니다. 마지막으로, 나는 그 키워드 (일부 합리적인;) 심지어 도메인/비디오 뒤에 무엇이 이해하는 데 도움이 될 수 있다고 ... –

3

Radim 쾰러의 용액 좋은 하나가 처리 될 것이다.

라우팅에 대한 더 많은 제어를 원하는 경우 다른 옵션은 맞춤 제약을 사용하는 것입니다.

여기 예입니다

RouteConfig.cs 그럼 홈 컨트롤러에서이

HomeController.cs 등의 조치를 할 수

routes.MapRoute(
      "PermaLinkRoute", //name of route 
      "{*customRoute}", //url - this pretty much catches everything 
      new {controller = "Home", action = "PermaLink", customRoute = UrlParameter.Optional}, 
      new {customRoute = new PermaLinkRouteConstraint()}); 

public ActionResult PermaLink(string customRoute) 
{ 
    //customRoute would be /friendly-content-title..do what you want with it 
} 
,

이 마법은 MapRoute 호출에서 4 번째 인수로 지정한 IRouteConstraint에서 발생합니다.

PermaLinkRouteConstraint.cs

public class PermaLinkRouteConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, 
     RouteDirection routeDirection) 
    { 
     var permaRoute = values[parameterName] as string; 
     if (permaRoute == null) 
      return false; 

     if (permaRoute == "friendly-content-title") 
      return true; //this indicates we should handle this route with our action specified 

     return false; //false means nope, this isn't a route we should handle 
    } 
} 

난 그냥 당신이 기본적으로 당신이 원하는 무엇이든 할 수 표시하려면이 같은 솔루션을 보여주고 싶었어요.

분명히 이것은 조정해야 할 것입니다. 또한 데이터베이스 호출을하지 않거나 Match 메소드 내부에서 느려지도록 조심해야합니다. 웹 사이트를 통해 전달되는 모든 요청에 ​​대해 호출되도록 설정 했으므로 (다른 순서로 호출되도록 이동할 수 있습니다).

Radim Köhler의 솔루션과 함께 사용하면 효과가 있습니다.

+1

여기에 제약은 좀 더 어려울 수 있습니다, 즉 * 친절한 제목 * 다를 수 있습니다. * (예 :'video') * 키워드는 물건을 단순화 할 가능성이 큽니다. 하지만 당신이 그걸 생각해 냈다는 게 마음에 들어요. 왜냐하면 실제로'IRouteConstraint'로 우리는 많은 마법을 쓸 수 있습니다. 그리고 아마도이 경우조차도 적합 할 수 있습니다. 너는 나의 표를 얻었다;) –

+0

예, 친숙한 제목은 다를 수있다. 각 내용마다 다른 제목 ... – mstfcck

+0

@mstfcck 의견을 이해하지 못합니다. 이렇게하면 어쨌든 친숙한 타이틀을 처리 할 수 ​​있습니다. 두 가지 게시 된 솔루션 중 어느 것도 당신을 위해 작동하지 않는다면 찾고자하는 것이 더 구체적 일 수 있습니까? –