Reputation: 3412
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?
Upvotes: 323
Views: 96091
Reputation: 21
This worked fine
@Html.ActionLink("Informationen", "About", "Home", new { area = "" }, new { @class = "nav-link" })
added new { area = "" }
.
Upvotes: 2
Reputation: 4607
Search for an answer to my question landed me here, basically it's the selection of correct overload of @Html.ActionLink
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
Upvotes: 0
Reputation: 779
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" })
Upvotes: 0
Reputation: 2470
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" })
Upvotes: 200
Reputation: 31
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" }))
Upvotes: 3
Reputation: 901
You forgot to add the HTMLAttributes parm.
This will work without any changes:
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" },null)
Upvotes: 90
Reputation: 9692
With attribute names:
@Html.ActionLink(linkText: "SomeText", actionName: "SomeAction", controllerName: "SomeControllerName", routeValues: new { parameterName = parameterValue}, htmlAttributes: null)
Upvotes: 1
Reputation: 533
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" }, new { })
This will take the overload: string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes
Upvotes: 5
Reputation: 13211
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()
...
}
Upvotes: 1
Reputation: 39
Just remove "Home" (name of the controller) so that the code would be:
Html.ActionLink("About", "About", new { hidefocus = "hidefocus" })
Upvotes: 3
Reputation: 30150
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" })
Upvotes: 345
Reputation:
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.
Upvotes: 29