2012-06-13 4 views
4

내 ASP.NET MVC3 응용 프로그램에서 라우팅에 문제가 있습니다. 원하는대로 작동하지 않습니다. 특정 paginations '페이지 내 MVC3 라우팅을 수정하는 방법

  • /{lang}/{controller}/{action}/{page}/{id}로 이동 - - 기억

    1. /{lang}/{controller}/{action}/{page} : Global.asax에에서

      라우팅 정의

      routes.MapRoute(
            "News", // Route name 
            "{lang}/{controller}/{action}/{page}/{id}", // URL with parameters 
            new { lang = "pl", controller = "News", action = "Index", page = 1, id = UrlParameter.Optional } // Parameter defaults 
           ); 
      

      그래서 나는이 상황에서 사용합니다 현재 페이지 및 특정 id 페이지로 이동합니다.

  • 링크 내가 사용를 생성 :

    i 페이지의 수이며, 랭 언어
    @Html.RouteLink(i.ToString(), "News", new { lang = ViewBag.Lang, page = i }) 
    

    .

    컨트롤러에서 내가 그것을 마녀 액션 처리 : ('2'클릭 된 경우)하지만 내 컨트롤러가 처리하지 않습니다

    public ViewResult Index(string lang, int page = 1) 
    

    문제

    @Html.RouteLink 것은 나에게 링크 /pl/News/Index/2을 제공합니다 그것과 페이지는 여전히 '1'입니다. 따라서 동일한 링크를 두 번 클릭하면 다음과 같이 나타납니다 : /pl/News/Index/2/2 그리고 나서 페이지는 '2'와 같습니다.

    누군가가 내게 정확히 어떻게 작동하는지 설명 할 수 있다면 해결할 수 있습니까?

    도움을 주시면 감사하겠습니다.

    +0

    을하지만, 내가 컨트롤러에서'id' (선택 사항)가 보이지 않습니다.'Index (string lang, int? id, int page = 1)'가되어서는 안됩니다. :) –

    +0

    당신은 신중하게 읽지 않습니다 :) 인덱스 액션에서 나는'id' 파라미터를 사용하지 않습니다. 다른 액션에서만 필요합니다. –

    +1

    제대로 이해했다면'/ pl/News/Index/2'를 클릭하면 오른쪽 _Index_ 액션이 실행되지만이 액션 내의 _page_ 값은 2가 아니라 1이됩니다.이 경로와 일치 할 수있는 다른 경로가 없습니까? 링크? –

    답변

    2

    나는 당신이 여기에 놓치고있는 것은 라우팅 시스템이 아웃 바운드 규칙을 생성하기 위해 현재 요청에서 변수 값을 사용하는 것 같다.

    예를 들어

    - 당신은 페이지/PL/뉴스/인덱스에 있다면이

    @Html.RouteLink(i.ToString(), "News") 
    

    라우팅 시스템과 같은 규칙을 생성하려고하면/2는

    lang = "pl", controller = "News", action = "Index", page = 2 
    

    lang페이지과 같이 이미 존재하는 변수를 사용하며 정확히 동일한 URL (/ pl/News/Index/2)을 생성합니다. 당신이 Html.RouteLink에서 익명 형식을 전달 물론 값의

    은 우선 순위로 처리하고 현재 요청에서 값을 재정의합니다. 따라서 귀하의 예에서 링크를 생성 할 때 어떤 URL을 사용하고 있는지를 고려해야합니다..우선

    순서는 다음과 같습니다

    1. 변수는 익명 형식에
    2. 기본 값은 경로에 정의
    3. 요청 변수를 통과했다. 그래서이 유지됩니다 -

    당신이 그것을 제공하지 않는 경우 LANG이 요청에서 수행되기 때문에이 부분

    lang = ViewBag.Lang 
    

    쓸모없는 것 같다.

    업데이트 (관련되지 않을 수도 있습니다) :

    또한 당신이 규칙에 대한 하나 개 이상의 일치하는 경우 있음을 알아 두셔야합니다 - 라우팅 시스템이 제약 조건을 만족하는 하나를 선택합니다 (요청에서 예시 값해야 디폴트 변수와 충돌하지)

    갱신 2 :

    라우팅 시스템은 제 가입 요청에 변수를 사용하여 당신이 를 지정, 그래서 만약 명시 적으로 (익명 형식을 통해) 변수를 지정 명시 적 -

    +0

    답변 해 주셔서 감사합니다.하지만 이해할 수 있는지 확실하지 않습니다. 너 내가 sth을 바꿀 것을 제안합니까? 또한'@ Html.RouteLink'를 사용하여 특정 경로 이름을 지정하면 올바른 규칙을 적용 할 수 있습니까? 하지만 그것은'page' 값을 덮어 쓰지 않는다는 것을 알았습니다. 하지만 내가해야 할 일은 이것 뿐이야? –

    +0

    @MateuszRogulski - 예 RouteLink를 사용할 때 지정된 규칙을 사용합니다 (내 업데이트가 귀하의 사례와 관련이 없다는 이유입니다). 전체 코드 (모든 규칙, 모든 동작 및 전체보기)를 게시 할 수 있습니까? - 방금 새 MVC 프로젝트로 규칙을 시도했지만 제대로 작동합니다 (페이지 값이 오버라이드 됨) – Bond

    +0

    잘못된 경로 규칙이 적용됩니다. 그러나이 경우 나는 'Default'경로를 얻으므로'@Html.RouteLink'가 어떻게 작동하는지 모른다.그러나 나는 그것을 변경하여 내 루트 규칙을 해결. 도와 주셔서 감사합니다. –

    0

    내가의 일부를 생각한다 (LANG이 URL의 첫 번째 세그먼트이기 때문에, 귀하의 경우) 더 요청 변수는 재사용되지 않을 것이다 문제는 컨벤션을 약간 깨뜨리는 것이고, MVC는 컨벤션을 성공적으로 라우팅하기 때문에 맵핑은 약간 파기됩니다.

    나는과 같이 라우팅을 다시 작성 제안 :

    routes.MapRoute(
          "News", // Route name 
          "{controller}/{action}/{lang}/{id}/{page}", // URL with parameters 
          new { controller = "News", action = "Index", lang = "pl", page = 1, id = UrlParameter.Optional } // Parameter defaults 
         ); 
    

    같은 일 것 URL에 대한 가장 일반적인 시나리오처럼 보인다 : 일부 악한 길이다

    http://yourdomainhere/news/pl/some-sort-of-permalink/1 
    
    +0

    고마워요.하지만 제 문제를 해결할 수 있는게 없었습니다. –

    관련 문제