2009-04-23 2 views
39

나는 내보기asp.net MVC Html.ActionLink() 유지 경로 값 내가 원하지 않는

<%= Html.ActionLink("LinkText", "Action", "Controller"); %> 

에 다음 ActionLink을 가지고 있고 그것은 http://mywebsite.com/Controller/Action

는 내가 추가 말 다음 URL을 생성 끝에 ID를 입력하십시오 : http://mywebsite.com/Controller/Action/53 페이지로 이동하십시오. 이 페이지에는 위에서 지정한 마크 업이 있습니다.

http://mywebsite.com/Controller/Action/53

합니다 (ID의 추가 통지)하지만 그것은 ID를 제거하고이 http://mywebsite.com/Controller/Action처럼, 원래했던 것처럼 (보고 싶어 : 나는 URL에서 볼 때 지금은 다음과 같습니다 생성 여기에 아무런 ID도 알려지지 않음)

어떻게 해결할 수 있습니까? 컨트롤러/동작이 변경 될 수 있으므로 하드 코딩 된 URL을 사용하고 싶지 않습니다.

+1

이 문제와 해결 방법에 대한 Microsoft 공식 설명은 [this workitem] (https://aspnetwebstack.codeplex.com/workitem/1346)을 참조하십시오. – NightOwl888

답변

40

이 솔루션은

<%= Html.ActionLink("LinkText", "Action", "Controller", 
    new { id=string.Empty }, null) %> 
+0

이 답변을 주셔서 감사합니다. 다른 상황에서 필요했지만, 그 후행 null로 머리에 못을 박았습니다! –

+0

이것은 약간 kludgey 보인다 ... 나는 동일한 일을 할 필요가 있지만 내가 Arnis L 같이 새로운 확장 메서드를 만들 수있을 것 같아요 –

+1

아래 게시이 또한 기능이 프레임 워크에 내장되어 있어야합니다 상황이 자주 발생합니다. 예를 들어 메뉴가 있으면 메뉴 링크에 모든 매개 변수가 포함되는 것을 원하지 않고 –

9

문제는 내장 된 메서드가 현재 제공하고있는 URL뿐만 아니라 여러분이 제공 한 것에서 입력을 가져 오는 것입니다. 이것을 시도해 볼 수 있습니다 :

<%= Html.ActionLink("LinkText", "Action", "Controller", new { id = ""}) %> 

id 매개 변수를 수동으로 지워야합니다.

4

는 이유를 알고하지 마십시오 (아래의 세 번째 매개 변수) 내 자신의 경로 값을 지정하는 것입니다,하지만 (아마도 때문에 MVC2 RC의) 나를 위해 작동하지 않았다. urlhelper 작성 방법 =>

public static string 
      WithoutRouteValues(this UrlHelper helper, ActionResult action,params string[] routeValues) 
     { 
      var rv = helper.RequestContext.RouteData.Values; 
      var ignoredValues = rv.Where(x=>routeValues.Any(z => z == x.Key)).ToList(); 
      foreach (var ignoredValue in ignoredValues) 
       rv.Remove(ignoredValue.Key); 
      var res = helper.Action(action); 
      foreach (var ignoredValue in ignoredValues) 
       rv.Add(ignoredValue.Key, ignoredValue.Value); 
      return res; 
     } 
+0

MVC2 RTM을 사용하여 동일한 문제가 발생했습니다. 나는'plan'이라는 라우트 값을 가지며 마지막 (디폴트) 라우트는'? plan = X'를 추가했습니다. 그래서'plan = route.Empty'와 같이'plan' 라우트 값의 마지막 (디폴트) 라우트에 기본값을 추가했습니다. 경로 정의가'plan'이라는 URL 세그먼트 변수를 정의하지는 않습니다. 그것이 작동하는 한, 나는 그것으로 멋지다. –

+0

나는이 문제를 안정적이고 우아하게 해결하기 위해이 변형을 사용했다. –

12

당신이 Html.RouteLink을 두 번째 "작업 만"경로를 등록하고 사용해야처럼 소리().

routes.MapRoute("ActionOnly", "{controller}/{action}", 
    new { controller = "Home", action = "Index" }); 

을 다음 ActionLink 그 링크가 사용 만드는 대신 :

Html.RouteLink("About","ActionOnly") 
+0

+1은'Html.RouteLink()'를 사용합니다. 나에게 도움이되었다. routeValues를 지정해도 MVC가 현재 동작을 잃어 버리고 인덱스 등으로 돌아갈 수있다. '@Html.RouteLink ("취소", "ThisSection_default", 새 {action = "색인"})'. – Jez

2

또 다른 방법은, ActionLink (Html ​​헬퍼, 문자열, 문자열을 사용하는 RouteValueDictionary입니다 먼저 시작하면 응용 프로그램이 같은 경로를 등록) 과부하, 다음 중 하나가 값이 명시 적으로 오버라이드 (override) 할 필요하거나 단지에 원하는 것을 모르는 경우 마지막 매개 변수

<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %> 
4

에 null을 넣어 할 필요가 없습니다 추가 매개 변수 목록을 무효화하면 아래와 같은 확장 메서드를 사용할 수 있습니다.

<a href="@Url.Isolate(u => u.Action("View", "Person"))">View</a> 

구현 세부 사항은 내가 동적으로 내 메뉴 링크를 필요 in this blog post

+0

깨끗하고 단순하며 매우 좋은 +1 –

+1

더러운 해킹입니다 ...하지만 지금까지 발견 된 최상의 해결책입니다. –

0

있습니다. HTML 헬퍼를 단순하게 사용하지 않고 모든 단일 페이지에 대해 많은 추가 코드와 라우팅을 구현하는 것이 아닙니다.

<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a> 
4

명시 적으로 동작 이름을 "동작 /"으로 설정했습니다. 해킹과 비슷하지만 빠른 수정입니다.

@Html.ActionLink("Link Name", "Action/", "Controller") 
+0

나는 이것을해야만했다. 링크는 색인을 작성해야했기 때문에 "/"를 작업으로 사용할 수 있었다. @ Html.ActionLink ("링크 이름", "/", "컨트롤러") – Derrick

0

Html.ActionLink의 오버로드는 이후 버전의 MVC에서 변경되었습니다.MVC 5 이상. 이렇게하는 방법은 다음과 같습니다.

@Html.ActionLink("LinkText", "Action", "Controller", new { id = "" }, null) 

참고 ID 매개 변수에는 ""을, HTMLATTRIBUTES에는 null을 전달했습니다.