Razor actionlink autogenerating ?length=7 in URL?
I have the link below on a razor page:
@Html.ActionLink("Create New Profile", "Create", "开发者_如何学编程Profile", new { @class="toplink" })
It appears in thes source of view page as shown below:
<a href="/admin/profile/create?length=7" class="toplink">Create New Profile</a>
When I click on the link the URL is like this:
http://localhost:54876/admin/profile/create?length=7
I don't want ?length=7
. Why is this auto generated?
The ActionLink
override you are using matches to the (string linkText, string actionName, Object routeValues, Object htmlAttributes) override. So your "Profile" value is being passed to the routeValues
parameter. The behavior of this function with respect to this parameter is to take all public properties on it and add it to the list of route values used to generate the link. Since a String only has one public property (Length) you end up with "length=7".
The correct overload you want to use is the (string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes) and you call it loke so:
@Html.ActionLink("Create New Profile", "Create", "Profile", new {}, new { @class="toplink"})
I'm not sure the exact cause of this, but change it to:
@Html.ActionLink("Create New Profile", "Create", "Profile", new {}, new { @class="toplink" })
I don't know which overload MVC is picking when you leave off the last parameter (htmlattributes
is the added one), but that will fix it. One of these days I'll investigate and figure out exactly what's going on.
Another thing to note, since you are defining the controller in the @ActionLink
, which you may not need to do, for example, the view that your "Create New Profile" @ActionLink
is expressed in might be "/admin/profile/index.cshtml", a view that lists existing profiles, in this case, you do not need to define the controller in the @ActionLink
as the @ActionLink
is already relative to the ProfileController
, so your @ActionLink
could be
@Html.ActionLink("Create New Profile", "Create", null, new { @class="toplink" })
I used null
instead of new{}
as the marked answer does, I think this is more appropriate myself. ActionLink overloads are not the most straightforward thing ever.
精彩评论