为什么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)