我对此代码的原因非常困惑
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })
导致此链接:
<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>
hidefocus
部分是我的目标,但?Length=4
来自何处?
答案 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)