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

我非常困惑,为什么这个代码

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

结果在这个链接:

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

hidefocus部分是我想要实现的,但是hidefocus ?Length=4从哪里来?

长度= 4来自尝试序列化string对象。 您的代码正在运行此ActionLink方法:

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

这为routeValues提供了一个string对象“Home”,MVCpipe道search公共属性将其转换为路由值。 在string对象的情况下,唯一的公有属性是Length ,并且由于将不存在使用Length参数定义的路由,所以将属性名称和值附加为查询string参数。 你可能会发现,如果你从一个不在HomeController上的页面运行它,它会抛出一个错误的About操作方法。 尝试使用以下内容:

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

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

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

您忘了添加HTMLAttributes参数。

这将工作没有任何改变:

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

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

我相信你只需要添加new { }null作为最后一个参数。

编辑:只是重新读这篇文章,并意识到你可能要指定null作为第二个参数,而不是最后一个。

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

这将采取重载:stringlinkText,stringactionName,stringcontrollerName,对象routeValues,对象htmlAttributes

请用五(5)个参数使用正确的重载方法。 例:

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

只要删除“家”(控制器的名称),使代码将是:

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

正如乔纳森·沃特尼(Jonathon Watney)在评论中指出的那样,这也是值得的

Html.BeginForm()

方法。 在我的情况下,我在一个Create.cshtml针对相应的控制器+创build行动,并具有发布请求

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

在渲染时将查询string“?Length = 6”添加到表单动作中。 由roryf批准的答案,并意识到“Create”的string长度是6,我终于通过删除显式动作规范来解决这个问题:

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

具有属性名称:

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