2014-12-17 1 views
2

은이 같은 작업이 있습니다경로 속성에 슬러그를 설정하는 방법은 무엇입니까?

[HttpGet] 
[Route("~/books/{id:int:min(1)}/{slug?}")] 
public ActionResult Book(int? id, string slug) 
{ 
    if (slug == null) 
    { 
     slug = "awesome-book"; 
     return RedirectToAction("Book", new { id, slug }); 
    } 

    etc. 
} 

문제는 새로운 경로가 같이 발생하는 것입니다 '책/1 슬러그 = 멋진 책?'하고 내가 '책을 원하지만 아니다/1/awesome-book '입니다. 어떻게 슬러그를 적절하게 설정할 수 있습니까?

+0

어떤 버전의 MVC를 사용하고 있습니까? –

+0

MVC 버전 : 5.2.2 – Dan

답변

4

이것은 경로 URL을 생성하는 데 문제가 있습니다. slug 경로 매개 변수는 선택 사항이므로 라우팅 프레임 워크는 /books/1에서 중지하고 URL에 포함되지 않은 모든 매개 변수를 검색어 문자열로 사용합니다.이 경우에는 slug이 포함됩니다. 이것은 라우팅 프레임 워크가 사용하는 단락 회로 시스템 때문이며 실제로 할 수있는 일은 거의 없습니다.

해결 방법이 있습니다. 선택적 매개 변수를 사용하는 대신 다른 경로를 사용하는 경우 해당 경로의 이름을 지정한 다음 명시 적으로 참조 할 수 있습니다. 예를 들면 : 당신은 당신이 원하는 URL 될 겁니다,

return RedirectToRoute("BookWithSlug", new { id, slug }); 

그리고 :

[Route("~/books/{id:int:min(1)}", Order = 1)] 
[Route("~/books/{id:int:min(1)}/{slug}", Order = 2, Name = "BookWithSlug")] 

는 그런 다음에 URL을 생성 할 수 있습니다.

+0

네, 고맙습니다. "/ books/1/pages"와 같은 다른 경로가 있으면 불행히도이 작업은 슬러그와 다른 세그먼트를 구분할 수 없기 때문에 여러 경로를 감지합니다 노선. – Dan

+1

기술적으로는 이전에'/ books/1/pages'에 가려고해도 두 개의 일치하는 경로가 일치하는 것처럼 문제가 발생했습니다. 그럼에도 경로 매개 변수를 간단히'{slug : regex (^ (?! pages) $)} '로 변경하면됩니다. –

+0

동의하고 정규 표현식 솔루션에 대해 감사하지만 아직 불만이 들지 않습니다. "페이지"나는 곤경에 빠지게 될 것이다. 나는 당신이 더 좋은 아이디어를 가지고 있지 않을 때 (그리고 이드도 가지고 있지 않다면) "서브 루트"를 갖지 않을 것이라는 것을 알고있는 루트에만 슬러그를 추가 할 것이라고 생각한다. /books/pages에 "서브 루트"를 지정하는 것에 대해 생각하고 있습니다. bookId = 1 꽤 좋지는 않지만. – Dan

관련 문제