ASP.Net MVC Html.ActionLink가 기존 경로 값을 사용하는 것을 어떻게 중지할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1817421

  •  08-07-2019
  •  | 
  •  

문제

제가 작업 중인 웹사이트에는 상당히 복잡한 라우팅 구조가 있으며 우리가 사용하는 방식으로 URL을 작성하기 위해 라우팅 엔진을 사용하는 데 어려움을 겪고 있습니다. 필요 건설될 것입니다.

RegEx 기반 패턴 일치를 사용하여 여러 변수를 단일 경로 세그먼트로 그룹화하는 검색 결과 페이지가 있습니다(예:"www.host.com/{structuralParameters}"는 다음과 같을 수 있습니다."www.host.com/variableA-variableB-variableC" - 여기서 변수 A부터 C까지는 모두 선택 사항입니다.이것은 약간의 작업 후에 우리에게 잘 작동합니다.

우리가 겪고 있는 문제는 ActionLink 메서드의 성가신 기능과 관련하여 해결됩니다.동일한 컨트롤러/액션을 가리키면 원하든 원하지 않든 기존 경로 값이 유지됩니다.우리는 링크의 모양을 제어하는 ​​것을 선호하며 어떤 경우에는 기존 매개변수를 유지할 수 없습니다.예를 들어 사이트의 기본 탐색이 매개변수가 설정되지 않은 검색 결과 페이지(원하는 경우 기본 검색 페이지)로 연결되는 경우를 들 수 있습니다.이는 명백한 확장 지점 없이 구현을 지시하는 것처럼 보이는 ASP.Net MVC 프레임워크의 드문 인스턴스이기 때문에 이것이 짜증나는 기능이라고 말합니다. 우리는 마스터 페이지에 간단한 탐색 링크를 작성하기 위해 사용자 정의 ActionLink 코드를 생성하지 않는 것을 선호합니다!

이러한 매개변수를 빈 문자열로 명시적으로 설정해야 한다고 말하는 사람도 있었지만 이를 시도하면 경로 값의 매개변수가 쿼리 문자열 매개변수로 변경될 뿐입니다.ActionLink 메서드에 매개 변수로 명시적으로 전달하지 않는 값을 명시적으로 제외해야 한다는 것은 제 생각에는 옳지 않은 것 같습니다. 그러나 이것이 유일한 옵션이라면 이를 사용할 것입니다.그러나 현재 쿼리 문자열에 표시되는 경우 매개변수를 경로에 직접 입력하는 것만큼 쓸모가 없습니다.

나는 우리의 라우팅 구조가 이 문제를 악화시킨다는 것을 알고 있습니다. 우리가 더 간단한 접근 방식(예:www.host.com/variableA/variableB/variableC) 그러나 우리의 URL 구조는 협상할 수 없습니다. 이는 유용성, SEO 및 링크/콘텐츠 공유와 관련된 매우 구체적인 요구 사항을 충족하도록 설계되었습니다.

해당 링크가 동일한 작업 메서드로 연결되더라도 Html.ActionLink를 사용하여 현재 경로 데이터를 사용하지 않고(또는 가능한 경우 명시적으로 경로 세그먼트를 제외할 필요 없이) 페이지에 대한 링크를 생성하려면 어떻게 해야 합니까?

경로 세그먼트를 명시적으로 제외해야 하는 경우 메서드가 경로를 쿼리 문자열 매개 변수로 렌더링하지 못하게 하려면 어떻게 해야 합니까?

사소해 보이는 이 문제는 우리에게 엄청난 슬픔을 안겨주고 있으며, 이 문제를 해결하는 데 도움을 주시면 감사하겠습니다.

편집하다:LukLed가 요청한 대로 샘플 ActionLink 호출은 다음과 같습니다.

// I've made it generic, but this should call the Search action of the 
// ItemController, the text and title attribute should say "Link Text" but there
// should be no parameters - or maybe just the defaults, depending on the route.
// 
// Assume that this can be called from *any* page but should not be influenced by
// the current route - some routes will be called from other sections with the same
// structure/parameters.
Html.ActionLink( 
    "Link Text",
    "Search", 
    "Item", 
    new { }, 
    new { title = "Link Text" } 
);
도움이 되었습니까?

해결책

호출 시 경로 값을 null 또는 빈 문자열로 설정 Html.ActionLink 또는 Html.RouteLink (또는 URL 생성 방법)은 "주변" 경로 값을 지웁니다.

예를 들어, 표준 MVC 컨트롤러/작업/ID 경로를 사용하여 "Home/Index/123"에 있다고 가정합니다.전화하면 Html.RouteLink(new { id = 456 }) 그러면 MVC는 다음의 "주변" 경로 값을 확인합니다. controller="Home" 그리고 action="Index".또한 주변 경로 값도 확인합니다. id="123" 하지만 이는 명시적인 "456"으로 덮어쓰여지게 됩니다.이렇게 하면 생성된 URL이 "Home/Index/456"이 됩니다.

매개변수의 순서도 중요합니다.예를 들어 전화를 했다고 해보자. Html.RouteLink(new { action = "About" })."정보" 작업은 현재 "인덱스" 작업을 덮어쓰고 "id" 매개변수는 완전히 지워집니다!그런데 왜냐고요?매개변수 세그먼트를 무효화하면 그 이후의 모든 매개변수 세그먼트도 무효화되기 때문입니다.이 경우 "action"은 새로운 명시적 값에 의해 무효화되었으므로 그 뒤에 오는 명시적 값이 없는 "id"도 무효화됩니다.따라서 생성된 URL은 ID 없이 "Home/About"만 됩니다.

동일한 시나리오에서 전화를 걸면 Html.RouteLink(new { action = "" }) 그러면 생성된 URL은 빈 문자열로 "작업"을 무효화했기 때문에 "홈"일 뿐이고, 무효화된 "작업" 뒤에 왔기 때문에 "id"도 무효화되었습니다.

다른 팁

문제의 근원에 대한 해결책

최적의 솔루션(해결 방법 냄새가 나지 않음)은 문제의 뿌리가 있고 라우팅에 있는 문제를 해결하는 것 같습니다.

맞춤법을 썼어요 Route 클래스라는 RouteWithExclusions URL을 생성할 때 제외/제거해야 하는 경로 값 이름을 정의할 수 있습니다.문제는 라우팅이 경로 테이블을 통과하고 후속 경로에 동일한 경로 값 이름이 없는 경우입니다.

전체 문제는 자세히 설명되어 있습니다. 내 블로그 게시물 모든 코드도 거기에 제공됩니다.확인해 보세요. 이 라우팅 문제를 해결하는 데 도움이 될 수 있습니다.나는 또한 두 가지를 추가로 썼습니다 MapRoute 추가 매개변수를 취하는 확장 메소드.

링크를 완전히 제어하려면 링크를 직접 구축하세요.

<a href="~/variableA/variableB/<%= Html.Encode(Model.Target) %>">Click Here</a>

내부에서 필요한 것을 대체하십시오. href 기인하다.

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