2014-12-01 5 views
0

RouteConfig에서 Routing Attributes로 전환하려고합니다.MVC5 라우팅 속성 다시 작성 - 기본 페이지

저는 Adam Freeman의 Pro ASP.NET MVC 5 서적을 읽고 있는데 클라이언트의 페이징을 처리하는 다음 코드를 변환하려고합니다.

routes.MapRoute(
     name: null, 
     url: "{controller}/Page{page}", 
     defaults: new { action = "Index", status = (string)null }, 
     constraints: new { page = @"\d+" } 
); 

위대한 작품입니다. 내가 다른 URL로 이동으로, 링크는

http://localhost:65534/Client - Default page 
http://localhost:65534/Client/Page2 - Second page 

지금 내가 URL 속성을 시도하고 그것이 어떻게 '꽤'링크가 올 때 문제의 비트를 가지고하기로 결정했습니다 아주 예뻐요. 모든 링크가 정상적으로 작동하지만 문제를 해결하려고하는 '라우팅 재 작성'입니다.

다음은 컨트롤러의 중요한 부분입니다. 인덱스 위의 속성을 가진

[RoutePrefix("Client")] 
[Route("{action=index}/{id:int?}")] 

public class ClientController : Controller { 

    [Route("Page{page:int?}")] 

    public ActionResult Index(string sortOrder, string search = null, int page = 1) { 

는/클라이언트/또는 클라이언트에/페이지가 기본 페이지를

[Route("Page{page:int?}")] 
    [Route] 

작품을 잡으려고 빈 경로를 추가하는 나에게 (404)

을 제공합니다 것/Client와/Client/Page3에 대한 것이었지만 이제는 URL의 재 작성이 엉망입니다. 호출기의 3 페이지를 클릭하면 URL이

http://localhost:65534/Client?page=3 

이고 원하는 것은 아닙니다.

[Route("Page{page:int?}")] 
    [Route("{page=1:int?}")] 

로 경로를 변경하면 거의 100 % 작동하지만/클라이언트의 기본 링크는 그래서, 지금 도움을 요청하고 지금

http://localhost:65534/Client/Page 

입니다. 원본 MapRoute을 속성으로 올바르게 변환하려면 어떻게해야합니까?

답변

2

그냥 사용

[Route("", Order = 1)] 
[Route("Page{page:int}", Order = 2)] 

UPDATE

노골적 단순히 라우팅 프레임 워크는 바보입니다. 어떤 경로가 가장 인지에 대한 결정을 내리지는 않으며, 단지 일치하는 경로를 찾고 반환합니다. 당신은 같은 것을 할 경우 :

Url.Action("Index", "Client", new { page = 1 }) 

을 당신은 /Client/Page1가 될 생성 된 URL을 기대하고 있지만, page은 본질적으로 선택 사항입니다 경로를 갖고 있기 때문에, 항상 그 길을 선택하고 물건을 할 수없는 것도 추가합니다 쿼리 문자열로 URL에 입력하십시오 (예 : /Client?page=1). 이 문제를 해결할 수있는 유일한 방법은 실제로 원하는 경로의 이름을 지정하고 해당 경로를 사용하여 URL을 생성하는 것입니다. 다음

[Route("", Order = 1)] 
[Route("Page{page:int}", Name = "ClientWithPage", Order = 2)] 

그리고 : : 예를 들어

Url.RouteUrl("ClientWithPage", new { page = 1 }) 

그런 다음, 당신은 당신이 직접 참조하고 있기 때문에 예상 경로를 얻을 수 있습니다.난 당신이 무슨 뜻인지 모르겠어요 2

UPDATE 번호는 "PagedList.MVC에 가서에 이름 속성을 추가". PagedList는 이미 사용자 정의 페이지 링크를 지원하기 때문에 코드에 핵심적인 변경이 필요하지 않습니다. 그냥 같은 것으로 호출기 코드를 변경 :

@Html.PagedListPager((IPagedList)ViewBag.OnePageOfItems, page => Url.RouteUrl("ClientWithPage", new { page = page })) 

그리고 당신은 당신이 원하는 URL 스타일을 얻을 것이다. 속성 라우팅은 전통적인 라우팅보다 조금 더 까다 롭습니다 만, 나는 쓸모가 없다고 거의 말하지 않습니다. 기존 라우팅보다 훨씬 유연하지만 유연성에는 약간의 비용이 듭니다.

+0

이전에는 '주문'속성을 사용해 보았습니다. 나는 여전히 ** Client? page = 3 **을 얻고 순서를 변경해도 문제가 발생하지 않는다. –

+0

위 업데이트를 참조하십시오. –

+0

추가 설명은 Chris에게 감사드립니다. 이것은 URL 리다이렉션에 대한 속성의 사용을 완전히 무효화하고 무의미한 기능으로 만듭니다. PagedList.MVC에 가서 이름 속성을 추가 할 가능성은 없습니다. RoutingConfig 파일로 돌아가겠습니다. –

관련 문제