Answers:
Length = 4来自尝试序列化字符串对象。您的代码正在运行此ActionLink
方法:
public static string ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, object htmlAttributes)
这string
为routeValues 使用对象“ Home”,MVC管道通过该对象搜索公共属性,将其转换为路由值。对于string
对象,唯一的公共属性是Length
,并且由于将没有使用Length参数定义的路由,因此它将属性名称和值附加为查询字符串参数。您可能会发现,如果从不在HomeController
其上的页面运行此命令,则会抛出有关缺少About
操作方法的错误。尝试使用以下内容:
Html.ActionLink("About", "About", new { controller = "Home" }, new { hidefocus = "hidefocus" })
Url.Action()
。从更改为Url.Action("Action", "Controller", new { area = "" })
可以Url.Action("Action", new { controller = "Controller", area = "" })
防止显示Length属性。
Html.ActionLink("About", "About", "Home", routeValues: null, htmlAttributes: new { hidefocus = "hidefocus" })
我解决此问题的方法是在匿名声明(new {}
)之前的第四个参数中添加一个null,以便它使用以下方法重载:(linkText,actionName,controllerName,routeValues,htmlAttributes):
Html.ActionLink("About", "About", "Home", null, new { hidefocus = "hidefocus" })
controller
和来指定routeValues,area
以防止Length属性显示在URL中。
routeValues
。例如:Html.ActionLink("About", "About", "Home", new {@area = "Admin"}, new { hidefocus = "hidefocus" })
ActionLink
,则MVC将Length=x
在URL的末尾包含一个奇怪的参数。例如,将其放在页面上,然后查看页面的源,您将明白我的意思: @Html.ActionLink("About", "About", "Home", new { area = "Admin" }, new { hidefocus = "hidefocus" })
@Html.ActionLink("About", "About", "Home", new { area = "Admin" })
但是,如果将controller
条目放在中routeValues
,则永远不会Length=x
在URL中。
@
的@area = "Admin"
,只是让你知道。
您忘记添加HTMLAttributes参数。
这将无需任何更改即可工作:
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" },null)
ActionLink的参数不正确,它正在尝试将“ Home”值用作路由值,而不是匿名类型。
我相信您只需要添加new { }
或null
作为最后一个参数。
编辑:只需重新阅读文章,并意识到您可能希望将null指定为倒数第二个参数,而不是最后一个。
请使用具有五(5)个参数的右重载方法。例:
@using (@Ajax.BeginForm("Register", "Account", null,
new AjaxOptions
{
HttpMethod = "POST",
OnSuccess = "OnSuccess",
OnFailure = "OnFailure",
OnBegin = "OnBegin",
OnComplete = "OnComplete"
}, new { @class = "form-login" }))
正如乔纳森·沃特尼(Jonathon Watney)在评论中指出的那样,
Html.BeginForm()
方法。以我为例,我在一个Create.cshtml中定位了相应控制器+ Create操作的发布请求,
using (Html.BeginForm("Create")) {
@Html.AntiForgeryToken()
...
}
呈现时将查询字符串“?Length = 6”添加到表单操作中。在roryf批准的答案的提示下,实现“ Create”的字符串长度为6,我终于通过删除显式操作规范解决了这个问题:
using (Html.BeginForm()) {
@Html.AntiForgeryToken()
...
}