Why does Html.ActionLink render "?Length=4"

asp.net Mvc

asp.net Mvc Problem Overview


I'm VERY confused as to why this code

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

results in this link:

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

The hidefocus part is what I was aiming to achieve, but where does the ?Length=4 come from?

asp.net Mvc Solutions


Solution 1 - asp.net Mvc

The Length=4 is coming from an attempt to serialize a string object. Your code is running this ActionLink method:

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

This takes a string object "Home" for routeValues, which the MVC plumbing searches for public properties turning them into route values. In the case of a string object, the only public property is Length, and since there will be no routes defined with a Length parameter it appends the property name and value as a query string parameter. You'll probably find if you run this from a page not on HomeController it will throw an error about a missing About action method. Try using the following:

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

Solution 2 - asp.net Mvc

The way I solved this is was adding a null to the fourth parameter before the anonymous declaration (new {}) so that it uses the following method overload: (linkText, actionName, controllerName, routeValues, htmlAttributes):

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

Solution 3 - asp.net Mvc

You forgot to add the HTMLAttributes parm.

This will work without any changes:

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

Solution 4 - asp.net Mvc

The parameters to ActionLink are not correct, it's attempting to use the "Home" value as a route value, instead of the anonymous type.

I believe you just need to add new { } or null as the last parameter.

EDIT: Just re-read the post and realized you'll likely want to specify null as the second last parameter, not the last.

Solution 5 - asp.net Mvc

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

This will take the overload: string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes

Solution 6 - asp.net Mvc

Just remove "Home" (name of the controller) so that the code would be:

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

Solution 7 - asp.net Mvc

Kindly use right overloaded method with five (5) parameters. Example:

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

Solution 8 - asp.net Mvc

As Jonathon Watney pointed out in a comment, this also goes for

> Html.BeginForm()

methods. In my case, I was in a Create.cshtml targeting the post request of the corresponding controller + Create action and had

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

which was adding the querystring "?Length=6" to the form action when rendered. Hinted by roryf's approved answer and realizing the string length of "Create" is 6, I finally solved this by removing the explicit action specification:

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

Solution 9 - asp.net Mvc

With attribute names:

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

Solution 10 - asp.net Mvc

This worked fine

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

added new { area = "" }.

Solution 11 - asp.net Mvc

Perhaps others had the same issue and need to supply a class value via HTMLAttributes parm. Here's my solution:

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

Solution 12 - asp.net Mvc

Search for an answer to my question landed me here, basically it's the selection of correct overload of @Html.ActionLink enter image description here which matters.
I was selecting an overload which didn't exist, (without the last null), and MVC had no such overload, resulting in a false URL something like the OP mentioned.

A personal note: you can use anonymous types doesn't mean you can use any of the overloads- which do not exist? - make certain: it has to be defined!
- Came here in times of MVC 5.2

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMy Alter EgoView Question on Stackoverflow
Solution 1 - asp.net MvcroryfView Answer on Stackoverflow
Solution 2 - asp.net MvcManuel CastroView Answer on Stackoverflow
Solution 3 - asp.net MvcJesse RoseView Answer on Stackoverflow
Solution 4 - asp.net MvcPaulView Answer on Stackoverflow
Solution 5 - asp.net Mvcuser2254436View Answer on Stackoverflow
Solution 6 - asp.net MvcFilView Answer on Stackoverflow
Solution 7 - asp.net MvcOmveer singh mauryaView Answer on Stackoverflow
Solution 8 - asp.net MvcFrederik Struck-SchøningView Answer on Stackoverflow
Solution 9 - asp.net MvcusefulBeeView Answer on Stackoverflow
Solution 10 - asp.net MvcelSchickView Answer on Stackoverflow
Solution 11 - asp.net MvcTaersiousView Answer on Stackoverflow
Solution 12 - asp.net MvcIrfView Answer on Stackoverflow