Html.ActionLink를 사용하여 다른 컨트롤러에서 작업 호출


224

를 사용하여 컨트롤러 사이를 탐색하려고합니다 ActionLink. 나는 예를 들어 내 문제를 말할 것이다.

Hat 컨트롤러의 인덱스보기에 있으며 아래 코드를 사용하여 제품 컨트롤러의 세부 사항 조치에 대한 링크를 작성하려고합니다.

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

제품 컨트롤러의 세부 사항에 대한 링크를 작성하는 대신 Hat 컨트롤러에서 세부 사항 조치에 대한 링크를 생성하고 끝에 길이 매개 변수를 추가합니다.

Hat/Details/9?Length=7

HTML.ActionLink이 문제로 인해 컨트롤러 간을 전환하는 데 사용할 수 없습니다 . 내가 뭘 잘못하고 있는지 알려 주시면 감사하겠습니다. 감사

추신 : MVC와 함께 제공되는 기본 경로 설정을 사용하고 있습니다

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

답변:


409

당신이 원하는 것은이 과부하입니다.

//linkText, actionName, controllerName, routeValues, htmlAttributes
<%=Html.ActionLink("Details", "Details", 
    "Product", new {id = item.ID}, null) %>

1
이 특정 과부하가 작동하는 이유와 Korki가 작동하지 않는 이유를 설명 할 수 있습니까? htmlAttributes를 null로 설정하면 링크 라우팅에 어떤 영향을 줍니까?
Derek Hunziker

35
다른 매개 변수를 사용하면 세 번째 인수는 경로 값이고 네 번째 인수는 html 속성이라고 가정하기 때문입니다. 다섯 번째 인수를 추가하면 메소드가 올바른 과부하를 사용하게됩니다. 지능적으로 과부하를 넘기면 더 이해가됩니다.
Banford

2
ActionLink의 과부하는 실제로 어색합니다. RouteValueCollection 대신 'object routeValues'를 허용하는 요점은 입력 양을 줄이는 것입니다. 그러나 여분의 null을 입력해야합니다. 비 직관적이고 비생산적인 ...
TiMoch

3
과부하 매개 변수의 설계가 잘못되었다는 데 동의합니다. 가장 긴 버그라고 생각했습니다. 나는 내가 잘못된 서명을 사용하고 있음을 이해하기 위해 모든
지능

1
향후 독자를 위해이 문제가 발생하고 CSS 스타일을 추가하려는 경우 올바른 과부하입니다. @ Html.ActionLink ( "MyText", "MyAction", "MyController", null, new {@class = "myClass"})
granadaCoder 2016 년

17

해당 매개 변수를 사용하면 잘못된 오버로드 된 기능 / 방법을 트리거합니다.

나를 위해 일한 것 :

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

HtmlHelper.ActionLink (string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)를 실행합니다.

MVC 4를 사용하고 있습니다.

안녕!


2
코드 줄은 언급 한 과부하를 유발하지 않지만 HtmlHelper.ActionLink (string linkText, string actionName, object routeValues, object htmlAttributes)를 트리거합니다. 이것은 OP가 피하려고했던 것과 같은 결과를 낳습니다. 널 매개 변수를 추가해야합니다.
TiMoch

고마워 TiMoch, 저거 그리워?
Stephan Venter

12

다음과 같이 명확하게하기 위해 명명 된 매개 변수를 사용하여 이러한 도우미를 작성하는 것이 좋습니다.

@Html.ActionLink(
    linkText: "Details",
    actionName: "Details",
    controllerName: "Product",
    routeValues: new {
        id = item.ID
    },
    htmlAttributes: null
)

2019 년 현재이 기능은 JetBrains의 ReSharper에서 구현되었습니다. 실제로이 상황에 매우 도움이됩니다.
Jamie

10

MVC Futures 어셈블리를 얻는다면 (권장 할 것임) ActionLink 및 람다를 생성 할 때 제네릭을 사용하여 경로를 구성 할 수 있습니다.

<%=Html.ActionLink<Product>(c => c.Action( o.Value ), "Details" ) %>

선물 조립은 여기에서받을 수 있습니다 : http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471


실제 링크에 감사드립니다-그것을 찾으려고 노력했습니다!
Perhentian

1
MVC2에 포함되어 있지 않으므로주의하십시오. 추론은 Actions가 반드시 Methods 일 필요는 없다는 것입니다. (저는 동의하지만 지금은 일반적인 방법을 사용하면서 마이그레이션하기가 어려울 것입니다). 다음은 2시에 보관되지 않은 이유에 대한 전체 기사입니다. haacked.com/archive/2008/08/29/…
Stu

7

당신은 ActionLink의 과부하에 잘못 맞았습니다. 대신 사용해보십시오.

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

6

그것을 시도해보십시오 그것은 잘 작동합니다

  <%:Html.ActionLink("Details","Details","Product",  new {id=item.dateID },null)%>

3

다른 해결책은 Urlhelper 객체 를 사용하여 다음과 같이 태그 의 href속성 을 설정하는 것입니다 <a>.

<a href="@Url.Action("Details", "Product",new { id=item.ID }) )">Details</a>

1

세부 사항은 "제품"폴더 아래의 "보기"페이지입니다.

ProductId는 테이블의 기본 키입니다. 다음은 Index.cshtml의 줄입니다.

 @Html.ActionLink("Details", "Details","Products" , new  {  id=item.ProductId  },null)

0

이 코드는 부분적으로 나를 위해 일했습니다.

<a href="/Content/Index?SubCategoryId=@item.Id">@item.Title</a>

이것이 작동하는 동안, 그것은 ActionLink 사용의 전체 요점을 우회합니다 ... ActionLink의 요점은 URL을 수동으로 입력하지 않고 생성 할 수있는 잠재적 인 문제를 피하는 것입니다.
Jon Story
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.