2013-04-25 2 views
2

경로 관련 문제를 다루었습니다. 경로가 있습니다 나는 경로를 정의하지만 난 여기에 (404)가 계속 :내 경로를 매핑해도 계속 404 이벤트가 발생했습니다.

여기
routes.MapRoute(
    name: "Default", 
    url: "{controller}", 
    defaults: new { controller = "Login", action = "Login" } 
); 

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

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

routes.MapRoute(
    name: "Act", 
    url: "{controller}", 
    defaults: new { controller = "Act", action = "New" } 
); 

localhost:51081/login works! 
localhost:51081/Home/25.04.2013 works! 
localhost:51081/act doesnt work! 
localhost:51081/calendar/index doesnt work! 

는 "로그인"와 "홈"작동하지만 "일정"과 나던을 "행동". "캘린더"매핑을 맨 위로 이동하면 "홈"매핑이 제대로 작동하지 않습니다. 어떻게 페이지를 매핑합니까?

는 기본적으로 나는 액션 이름이 URL의 예에 표시 할 해달라고 : http://localhost:51081/Home/Home/25.04.2013. 내가 그 asp.net 경로 당신이 MapRoute 테이블에 추가되는 순서대로 평가됩니다 기억 http://localhost:51081/Home/25.04.2013 or http://localhost:51081/calendar

+1

기본값은 대개 마지막으로 정의 된 경로이며, 아래쪽으로 이동합니다. – DGibbs

+1

실패한 경로는 무엇입니까? 또한 : 귀하의 "Act"route는 기본적으로 다른 default를 가진 첫 번째 route의 re-statement입니다. 잘 - 힘들어 : 그때까지, 그것은 이미 첫 번째 길을 칠 것입니다. 마찬가지로 "일정"경로는 * 두 번째 * 경로의 재 작성입니다. 다른 이름으로. –

+1

액세스하려는 URL을 언급하십시오. –

답변

3

처럼 @MarcGravell는 말한다 : 당신은 예외 케이스 노선 일정 및 홈에서

동일 특별한 규칙을 추가합니다. 당신은

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

법은 일정과 동일합니다 (이 작업을 무시합니다) 그 경로가 동적이지 정말 예외입니다 원인이 홈으로 {컨트롤러}를 교체하여보다 구체적인 당신의 경로를 매핑 할 수 있도록 두 경로가 필요하지 않습니다. Act가 아닌 Act/New를 호출하십시오. 기본 사용을 위해

:

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}", 
    defaults: new { controller = "Login", action = "Login" } 
); 

오프 물론 당신의 루트의 하단에 넣어.

+0

그 대답은 매우 유용하고 감사합니다. 하지만 내 경로를보다 동적으로 처리하고 싶습니다. 내가 말했듯이, 그렇다면 많은 라우팅을 작성해야만한다. – Ktt

+1

@Ktt no, 당신은 * exceptions *에 대한 특별 규칙 만 추가한다; 기본값은 나머지를 잡기위한 것입니다. 실제로 프로젝트에서 경로 매핑을 다르게 처리합니다. 즉, 액션 자체에 원하는 패턴으로 주석을 달아줍니다. 정말 잘 작동합니다. –

+0

그러면 모두에게 도움이 될 것입니까? : * routes.MapRoute ( 이름 : "기본값", URL : "{컨트롤러}", 기본값 : new {컨트롤러 = "로그인", 동작 = "로그인"} ) * * localhost : bla/login *하지만 * localhost : bla/act *에 해당하지 않습니다. – Ktt

1

처럼보고 싶어요.

"default"와 "act"경로는 동일한 패턴을 가지고 있기 때문에 동일합니다. 아마 "법"은 결코 타격을 입지 않을 것이다.

또한 "기본"경로는 매우 일반적이며 대부분의 요청이이를 충족시킵니다. 가장 구체적인 경로 순서 (예 : 하드 코드 경로)에서 구체적인 경로 순서 (예 : 모든 자리 표시 자)로 경로를 추가해야합니다.

그래서 foo/bar의 요청이있는 경우 "foo"가 컨트롤러로 해석 될 것이므로 "default"경로로 넘어갑니다. 그러면 "bar"리소스를 찾습니다. 존재하지 않습니다. 그러면 404가 표시됩니다.

"집"과 "일정"경로도 같은 패턴이므로 첫 번째로 정의 된 하나의 명중 경로 만 공격을 받게됩니다.

경로를보다 구체적으로 만들고 가장 구체적인 것부터 가장 덜 구체적인 것을 정의하십시오.

행운을 빈다.

2
routes.MapRoute(
      name: "Default", 
      url: "{controller}", 
      defaults: new { controller = "Login", action = "Login" } 
     ); 

이것은 //anything 일치하는 경로를 정의한다 /LoginController.Login을 사용하려고 시도하며 /anythinganythingController.Login을 사용하려고합니다. 이 경로는 어느 시점에서도 Login이 아닌 다른 "조치"를 선택할 수 없습니다.

당신이 그 모두를 멀리 생각하다,와 같은 것을 사용하는 경우 :

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

다음 그 /, /anything/anything/anythingelse의 일치합니다.

  • /는 매핑이 기본값의 측면에서 작동하는 방법을 설명하는 anythingController.anythingelse

희망에 매핑됩니다 anythingController.Index

  • /anything/anythingelse 매핑됩니다 HomeController.Index
  • /anything에 매핑합니다. 당신이 어떤 특정 경로가있는 경우

    , 그들은이 담요 기본 전에 을 추가해야합니다.

  • +0

    나는 그것을 거의 이해한다. 고마워. 그러면 ** routes.MapRoute ( 이름 : "Default", url : "{controller}/{action}")의 차이점은 무엇입니까? 기본값 : new {controller = "Login", action = "Login"} ); routes.MapRoute ( 이름 : "홈", URL : "{컨트롤러}/{날짜}", 기본값 : 새로운 {= "홈"컨트롤러, 액션 = "홈", 날짜 = UrlParameter.Optional} ); ** – Ktt

    +0

    @Ktt 두 번째는 항상 지정된 'Home'액션을 사용합니다. 첫 번째는 url의 두 번째 부분에서 액션을 취합니다. 기본값은'Login'입니다. 첫 번째는'/'를'LoginController'로 디폴트 설정하고, 두 번째는'/'를'HomeController'로 디폴트 설정합니다; 그러나 삽입 순서로 처리됩니다. 첫 번째 일치가 우선합니다. –

    +0

    기본적으로 http : // localhost : 51081/Home/Home/25.04.2013이라는 URL에 액션 이름을 표시하고 싶지 않습니다. http : // localhost : 51081/Home/25.04와 같이보고 싶습니다. .2013 또는 http : // localhost : 51081/calendar' – Ktt

    관련 문제