为什么Html.ActionLink呈现“?Length = 4”

时间:2009-05-05 10:31:15

标签: asp.net-mvc

我对此代码的原因非常困惑

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

导致此链接:

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

hidefocus部分是我的目标,但?Length=4来自何处?

12 个答案:

答案 0 :(得分:315)

Length = 4来自尝试序列化字符串对象。您的代码正在运行此ActionLink方法:

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

这为routeValues采用string个对象“Home”,MVC管道搜索公共属性将其转换为路由值。对于string对象,唯一的公共属性是Length,并且由于没有使用Length参数定义的路由,因此将属性名称和值附加为查询字符串参数。您可能会发现,如果您从不在HomeController上的页面运行此操作,则会抛出有关缺少About操作方法的错误。请尝试使用以下内容:

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

答案 1 :(得分:186)

我解决这个问题的方法是在匿名声明(new {})之前向第四个参数添加一个null,以便它使用以下方法重载:(linkText,actionName,controllerName,routeValues,htmlAttributes):< / p>

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

答案 2 :(得分:87)

您忘记添加HTMLAttributes parm。

这将无需任何更改即可使用:

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

答案 3 :(得分:27)

ActionLink的参数不正确,它试图将“Home”值用作路由值,而不是匿名类型。

我认为您只需添加new { }null作为最后一个参数。

编辑:重新阅读帖子并意识到您可能希望将null指定为倒数第二个参数,而不是最后一个参数。

答案 4 :(得分:5)

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

这将需要过载: string linkText,string actionName,string controllerName,Object routeValues,Object htmlAttributes

答案 5 :(得分:3)

请使用右侧重载方法和五(5)个参数。例如:

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

答案 6 :(得分:2)

只需删除“Home”(控制器的名称),以便代码为:

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

答案 7 :(得分:1)

使用属性名称:

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

答案 8 :(得分:1)

效果很好

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

添加了 new { area = "" }

答案 9 :(得分:0)

正如Jonathon Watney在评论中指出的那样,这也适用于

  

Html.BeginForm()

方法。在我的情况下,我在 Create.cshtml 中定位相应控制器的发布请求+创建操作并且

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

在渲染时将查询字符串“?Length = 6”添加到表单操作中。 roryf批准的答案暗示并且意识到“创建”的字符串长度为6,我终于通过删除明确的操作规范来解决这个问题:

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

答案 10 :(得分:0)

也许其他人也有同样的问题,需要通过 HTMLAttributes 参数提供 class 值。 这是我的解决方案:

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

答案 11 :(得分:0)

寻找问题的答案使我落在了这里,基本上是选择@Html.ActionLink的正确重载 enter image description here 重要。
我正在选择一个不存在的重载( last null)和 {{1 }} 没有这样的重载,从而导致了一个虚假的URL,类似于上面提到的OP。

个人 注释: ,您可以 MVC 匿名类型并不意味着您可以使用任何重载-< em>哪个不存在? - 确定: 必须要定义!
-在MVC 5.2时代来到这里