回答:
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 {}
)の前の4番目のパラメーターにnullを追加して、次のメソッドオーバーロードを使用することです:(linkText、actionName、controllerName、routeValues、htmlAttributes):
Html.ActionLink("About", "About", "Home", null, new { hidefocus = "hidefocus" })
controller
し、area
URLに現れてからのLengthプロパティを維持します。
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のパラメーターが正しくありません。匿名タイプの代わりに「ホーム」値をルート値として使用しようとしています。
最後のパラメータとして、new { }
またはを追加する必要があるだけだと思いnull
ます。
編集:投稿をもう一度読んで、最後ではなく最後から2番目のパラメーターとしてnullを指定する可能性が高いことに気づいてください。
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" }, new { })
これはオーバーロードを取得します:文字列linkText、文字列actionName、文字列controllerName、オブジェクト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" }))
Jonathon Watneyがコメントで指摘したように、これは
Html.BeginForm()
メソッド。私の場合、対応するコントローラー+作成アクションのポストリクエストをターゲットとするCreate.cshtmlにいて、
using (Html.BeginForm("Create")) {
@Html.AntiForgeryToken()
...
}
これは、レンダリング時にフォームアクションにクエリ文字列"?Length = 6"を追加していました。roryfの承認された回答にヒントを得て、 "Create"の文字列長が6であると認識したので、明示的なアクション指定を削除することでこれを解決しました。
using (Html.BeginForm()) {
@Html.AntiForgeryToken()
...
}