Html.ActionLink가“? Length = 4”로 렌더링되는 이유


305

왜이 코드에 대해 매우 혼란 스럽습니다.

Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })

이 링크의 결과 :

<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>

hidefocus부분은 내가 달성하려는 목표이지만 어디에서 ?Length=4오는가?


4
이 동작은 Html.BeginForm () 메서드에서도 나타납니다.
Jonathon Watney

답변:


326

Length = 4는 문자열 객체를 직렬화하려는 시도에서 온 것입니다. 코드에서이 ActionLink방법을 실행 중입니다 .

public static string ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, object htmlAttributes)

stringrouteValues에 대해 "홈"오브젝트를 가져옵니다. MVC 배관은 공용 특성을 검색하여이를 루트 값으로 변환합니다. string객체 의 경우 유일한 공용 속성은 Length이며 길이 매개 변수로 정의 된 경로가 없으므로 속성 이름과 값을 쿼리 문자열 매개 변수로 추가합니다. 페이지가 아닌 페이지에서 실행하면 HomeController누락 된 About조치 방법에 대한 오류가 발생 합니다. 다음을 사용해보십시오.

Html.ActionLink("About", "About", new { controller = "Home" }, new { hidefocus = "hidefocus" })

@Blah_Blah 요즘 나는 이것을 전혀 사용하지 않고 내 자신의 <a> 태그를 작성하고 Url.Action ( "Action", "Controller")을 사용하는 것을 선호합니다
roryf

@roryf 걱정하지 마십시오 ...이 코드 검토에서 모범 사례로 사용되었지만 날짜를 확인하지 않았습니다. 날짜별로
스택 오버 플로우

좋은 대답입니다. 이것을 추가하기 위해 같은 이유로 Html.BeginRouteForm에서도 발생합니다. Html.BeginRouteForm ( "Route", "Action", FormMethod.Post)) Html.BeginRouteForm ( "Route", new {action = "AgentSignUp"}, FormMethod.Post)
이어야

와 함께 발생합니다 Url.Action(). 에서 변경 Url.Action("Action", "Controller", new { area = "" })하려면 Url.Action("Action", new { controller = "Controller", area = "" })게재의 길이 속성을 유지합니다.
John Washam

이러한 상황을 피하기 위해 다음과 같이 전달할 매개 변수를 항상 지정할 수 있습니다.Html.ActionLink("About", "About", "Home", routeValues: null, htmlAttributes: new { hidefocus = "hidefocus" })
Epiplon

195

내가 해결 한 방법은 익명 선언 ( new {}) 전에 네 번째 매개 변수에 null을 추가 하여 다음 메소드 오버로드를 사용하는 것입니다 (linkText, actionName, controllerName, routeValues, htmlAttributes).

Html.ActionLink("About", "About", "Home", null, new { hidefocus = "hidefocus" })

이 영역 사이를 연결하지 않는 경우 가장 좋은 답변입니다. 당신이 링크에 대한 영역을 지정해야하는 경우와 routeValues 지정해야 controller하고,을 area의 URL에 표시에서 길이 속성을 유지합니다.
John Washam

@JohnWasham 사실, 당신은 routeValues단지 영역에 컨트롤러를 지정할 필요가 없습니다 . 예를 들면 :Html.ActionLink("About", "About", "Home", new {@area = "Admin"}, new { hidefocus = "hidefocus" })
Epiplon

1
@epiplon, 내가 컨트롤러를 지정하는 이유는 htmlAttributes를의 마지막 인수로 포함하지 않으면 ActionLinkMVC가 Length=xURL 끝에 이상한 매개 변수를 포함하기 때문 입니다. 예를 들어 이것을 페이지에 넣은 다음 페이지의 소스를 보면 의미가 무엇인지 알 수 있습니다. @Html.ActionLink("About", "About", "Home", new { area = "Admin" }, new { hidefocus = "hidefocus" }) @Html.ActionLink("About", "About", "Home", new { area = "Admin" }) 그러나에 controller항목을 입력 하면 URL에 입력 routeValues되지 않습니다 Length=x.
John Washam

@epiplon, 당신은 또한 사용할 필요가 없습니다 @@area = "Admin"당신은 알겠지만.
John Washam

88

HTMLAttributes 매개 변수를 추가하지 않았습니다.

변경없이 작동합니다.

Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" },null)

나는 이것이 왜 나를 위해 작동하지 않는지 모르겠다. 나는 "new {hidefocus =" "}"로 시도했다.
Naredla Nithesh Reddy

28

ActionLink에 대한 매개 변수가 올바르지 않습니다. 익명 유형 대신 "홈"값을 경로 값으로 사용하려고합니다.

나는 당신이 new { }또는 null마지막 매개 변수로 추가해야한다고 생각합니다 .

편집 : 그냥 게시물을 다시 읽고 마지막이 아닌 두 번째 마지막 매개 변수로 null을 지정하려고한다는 것을 깨달았습니다.


1
BTW 사용할 수 없기 때문에 한 가지 방법을 제거해야합니다!
Marc Climent

5
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" }, new { })

오버로드가 발생합니다 : string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes


3

5 개의 매개 변수로 올바른 오버로드 된 방법을 사용하십시오. 예:

@using (@Ajax.BeginForm("Register", "Account", null,
    new AjaxOptions
    {
        HttpMethod = "POST",
        OnSuccess = "OnSuccess",
        OnFailure = "OnFailure",
        OnBegin = "OnBegin",
        OnComplete = "OnComplete"
    }, new { @class = "form-login" }))

컨트롤러 이름 뒤에 null 추가하면 도움이되었습니다.
Munam Yousuf

이것은 OP가 요청한 것이 아니라 Ajax 버전을 다루는 추가 보너스가있는 @Jesse의 답변과 사실상 동일한 대답이지만 동일한 문제와 관련이 있습니다.
gcoulby

2

코드가 다음과 같이되도록 "홈"(컨트롤러 이름)을 제거하십시오.

Html.ActionLink("About", "About", new { hidefocus = "hidefocus" })

1

속성 이름으로 :

 @Html.ActionLink(linkText: "SomeText", actionName: "SomeAction", controllerName: "SomeControllerName", routeValues: new { parameterName = parameterValue}, htmlAttributes: null)

0

Jonathon Watney가 의견에서 지적했듯이 이것은 또한

HTML.BeginForm ()

행동 양식. 내 경우 에는 해당 컨트롤러의 게시 요청 + 작업 작성을 대상 으로 Create.cshtml에 있었고

using (Html.BeginForm("Create")) {
  @Html.AntiForgeryToken()
  ...
}

렌더링 할 때 쿼리 문자열 "? Length = 6" 을 양식 작업 에 추가했습니다 . roryf의 승인 된 답변에 의해 힌트를 얻고 "Create"의 문자열 길이가 6임을 깨달으면서 명시적인 작업 사양을 제거 하여이 문제를 해결했습니다.

using (Html.BeginForm()) {
      @Html.AntiForgeryToken()
      ...
    }

0

아마도 다른 사람들도 같은 문제가 있었으며 HTMLAttributes parm을 통해 클래스 값 을 제공해야합니다 . 내 해결책은 다음과 같습니다.

@Html.ActionLink("About", "About", new { controller = "Home", area = "" }, new { hidefocus = "hidefocus", @class = "nav-item nav-link" })


0

내 질문에 대한 답변을 검색하면 여기에 도착했습니다. 기본적으로 @Html.ActionLink 여기에 이미지 설명을 입력하십시오 중요한 과부하의 선택입니다 .
나는 (존재하지 않는 과부하, 선택되었다 없이 마지막 null ) 및 MVC언급 된 영업과 같은 거짓 URL 뭔가 결과, 이러한 과부하가 없었다.

개인 참고 : 당신이 할 수 use익명 형식을 사용하면 overloads- 중 하나를 사용할 수 있습니다 의미하지 않는다 어떤을 존재하지? - 특정합니다 그것은 정의되어야한다!
-MVC 5.2 시대에 이곳에 왔습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.