문제

다음은 Global.asax 파일의 두 경로입니다. 두 번째 경로로 가려고 노력하고 있으며 기본 404 리소스가 없습니다.

첫 번째 경로를 제거하면 (이 예제에 나열된) 작동합니다.

이 문제를 해결하려면 어떻게해야합니까?

Global.asax 코드의 스 니펫

// GET: /user/PureKrome/Alert/69
routes.MapRoute(
    "User-Alert-Details",
    "user/{displayName}/alert/{alertId}",
    new { controller = "Account", action = "AlertDetails", alertId = 0 });

// GET: /user/PureKrome/Alert/create
routes.MapRoute(
    "User-Alert-Create",
    "user/{displayName}/alert/create",
    new { controller = "Account", action = "AlertCreate" });
도움이 되었습니까?

해결책

첫 번째 경로는 "욕심 많은"경로이며 마지막 매개 변수의 경고로서 "Create"를 행복하게 받아 들일 것입니다. Alertid 매개 변수를 숫자로만 한 것으로 보이므로 마지막 매개 변수가 숫자 여야한다는 경로 시스템을 알려주는 제약 조건을 추가해야합니다.

이것 좀 봐 지도 시간.

예를 들어:

// GET: /user/PureKrome/Alert/69
routes.MapRoute(
    "User-Alert-Details",
    "user/{displayName}/alert/{alertId}",
    new { controller = "Account", action = "AlertDetails", alertId = 0 },
    new { alertId = @"\d+" });

// GET: /user/PureKrome/Alert/create
routes.MapRoute(
    "User-Alert-Create",
    "user/{displayName}/alert/create",
    new { controller = "Account", action = "AlertCreate" });

노선의 순서를 뒤집을 수도 있지만, 그렇게하더라도 항상 숫자가 되려면 정확성에 대한 제약 조건을 포함해야합니다.

다른 팁

정확히 일치하도록 경로가 다른 방식으로 정의되기를 원합니다. create 제한되지 않은 경기 전에옵니다 alertId. 또는 또는 제약 조건을 추가 할 수 있습니다 alertId Twisty Maze가 언급 한 바와 같이.

라우팅은 경로를 위에서 아래로 일치 시키려고 노력하기 때문입니다. /user/PureKrome/Alert/create 일치 User-Alert-Details 생각하는대로 경로 create 값입니다 alertId. 그것들을 주위로 바꾸면 일치 할뿐입니다 User-Alert-Create 4 번째 세그먼트가 명시 적으로있는 경우 create 그리고 그것은 끝날 것입니다 User-Alert-Details 그렇지 않은 경우.

명확성을 위해, 그들은 다음과 같은 방식으로 일해야합니다.

// GET: /user/PureKrome/Alert/create
routes.MapRoute(
    "User-Alert-Create",
    "user/{displayName}/alert/create",
    new { controller = "Account", action = "AlertCreate" });

// GET: /user/PureKrome/Alert/69
routes.MapRoute(
    "User-Alert-Details",
    "user/{displayName}/alert/{alertId}",
    new { controller = "Account", action = "AlertDetails", alertId = 0 });  

이와 같은 또 다른 문제가 있으면 Phil Haack의 URL 디버거를 사용해보십시오. http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

문제는 컨트롤러에 대한 기본값과 첫 번째 매핑에서 동작을 지정했다는 것입니다.

이제 수신 요청은 첫 번째 경로에 의해 처리되며, 컨트롤러 이름이 누락 된 경우 기본값으로 대체되며 작업 이름이 누락 된 경우 기본값으로 대체됩니다.

그래서 실제로 당신이 말할 때 http : // localhost/someroute첫 번째 맵퍼는 행동을 시작하고 문자열을 컨트롤러 이름으로 간주 한 다음 조치를 찾지 않으므로 예제에서 "AlertCreate"인 기본 조치를 사용합니다. 이제 Mapper는 "Someroute"컨트롤러에서 Alertcreate라는 조치를 찾으려고합니다.

결론은 첫 번째 매핑이 모든 라우팅 요청을 처리하기 때문에 두 번째 매핑이 작동하지 않는다는 것입니다. (기본값이 지정되어 있기 때문에)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top