2017-12-20 3 views
0

routeattribute를 사용하여 모든 경로를 생성하는 방법이 있습니까? 내 웹 사이트에서dotnet core 2 - 모든 경로를 추적 하시겠습니까? (* menuPath/pageUrl.html)

은 우리가 동적 - 메뉴 및 페이지 URL과 함께 CMS를 갖고 있기 때문에, 내가 캐치에게 끝없는 슬래시 모든 경로를 필요 /자동차 /보험

/최고의

같은 미리 정의 된 경로를 가지고 있지만.

그래서 /whatever/this/is/a/menupath/withapage.html로 이동하면 내 Page 메서드로 이동해야합니다. withapage.html은 이 아니고이 필요합니다. DOTNET 코어 2에서 비슷한 일이

routes.Add(
      new GreedyRoute("{*menuPath}/{pageUrl}", 
      new RouteValueDictionary(new { controller = "Page", action = "Index" }), 
      new RouteValueDictionary(new { pageUrl = @"[0-9a-zA-ZøæåØÆÅ+_-]+.html" }), 
      new MvcRouteHandler())); 

     routes.Add(
      new GreedyRoute("{*menuPath}", 
      new RouteValueDictionary(new { controller = "Page", action = "List" }), 
      new MvcRouteHandler())); 

거기에 우리가 GreedyRoute이 설정을 사용

나는 다음과 같은 경로를 시도하지만, MVC 5에서

[Route("{*menuPath}/{pageUrl.html?}")] 
public async Task<IActionResult> Page(string menuPath, string pageUrl = null, CancellationToken token = default(CancellationToken)) 

를 작동하지 않는 이유는 무엇입니까?

답변

2

{*menuPath}은 캐치 올 매개 변수이며 경로 템플리트의 마지막 세그먼트로만 사용될 수 있습니다.

순수한 속성 라우팅으로 원하는 것을 얻을 수 있을지는 의문입니다. 하나의 문자열 매개 변수에 여러 개의 슬래시가 포함 된 URL 부분을 캡처하려고하지만 슬래시는 URL과 라우팅에 매우 특별한 의미가 있습니다. ,

[Route("{*menuPathAndPage}")] 
public async Task<IActionResult> Page(string menuPathAndPage, CancellationToken token = default(CancellationToken)) 
{ 
    var slashPos = menuPathAndPage.LastIndexOf('/'); 
    var menuPath = slashPos != -1 ? menuPathAndPage.Substring(0, slashPos) : menuPathAndPage; 
    var pageUrl = slashPos != -1 ? menuPathAndPage.Substring(slashPos + 1) : String.Empty; 

    // ... 
} 

글쎄, 아마보기의 순수한 관점에서 완벽한 해결책이 아니다 그러나이 방법은 당신을 위해 작동한다 : 나는 당신의 장소에 있다면 나는 다음과 같은 방법으로 그것을 해결 것입니다.

+0

그래, 나는 그 일을 실제로 끝내었다. 하지만 나는 이상하게 생각하는 사람이별로 없다고 생각합니다. 사람들은 보통 어떻게 menupaths 및 URL을 생성합니까? – sindrem

+1

저는 웹 API를 주로 사용하고 있습니다. 그래서 사람들이 보통 menupaths를 어떻게 해결하는지 질문 할 수는 없습니다. 어쩌면 그들은 쿼리 매개 변수로 경로를 전달하거나 일부 공유 기본 컨트롤러 클래스와 다른 메뉴 경로에 대해 다른 컨트롤러가있을 수 있습니다. – CodeFuller