次のようなコントローラーメソッドがあります。
public ActionResult Foo2(int uId)
{
return View();
}
これにアクションリンクを追加しました:
@Html.ActionLink("Test", "Foo2", "Main", new { uId = 12 })
しかし、クリックしたときの結果は次のとおりです。
.../Main/Foo2?Length=8
なぜこれが機能しないのですか?
次のようなコントローラーメソッドがあります。
public ActionResult Foo2(int uId)
{
return View();
}
これにアクションリンクを追加しました:
@Html.ActionLink("Test", "Foo2", "Main", new { uId = 12 })
しかし、クリックしたときの結果は次のとおりです。
.../Main/Foo2?Length=8
なぜこれが機能しないのですか?
ActionLink
メソッドの間違ったオーバーロードを使用しています。以下を使用する必要があります。
@Html.ActionLink("Test", "Foo2", "Home", new { uId = 12 }, null)
new { uId = 12 }
このオーバーロードは、HTML 属性としてではなく、ルート値として使用されると解釈します。使用しているオーバーロードnew { uId = 12 }
は、アクション リンクの TML 属性を持つオブジェクトとして解釈し ます。上記で指定されたオーバーロードを呼び出すことによりnull
、5 番目のパラメーターとして渡されます。これは、HTML 属性に使用され、オブジェクトはルート値として使用されます。
レンダリングされたものを見ることで、何が起こっているかを簡単に確認できます。
@Html.ActionLink("Test", "Foo2", "Home", new { uId = 12 })
// Renders: <a href="/Home/Foo2?Length=4" uId="12">Test</a>
@Html.ActionLink("Test", "Foo2", "Home", new { @class = "test-class" })
// Renders: <a class="test-class" href="/Home/Foo2?Length=4">Test</a>
@Html.ActionLink("Test", "Foo2", "Home", new { uId = 12 }, null)
// Renders: <a href="/Home/Foo2?uId=12">Test</a>
@Html.ActionLink("Test", "Foo2", "Home", new { uId = 12 }, new { @class = "test-class" })
// Renders: <a class="test-class" href="/Home/Foo2?uId=12">Test</a>
これで少しは解決することを願っています。
MVC には、同じパラメーター数を持つメソッドがいくつかあるため、間違ったオーバーロードが呼び出されています。これを試して:
@Html.ActionLink("Test", "Foo2", "Main", new { uId = 12 }, null)
この質問も参照してください。
別のStackoverflow Questionによると、次の順序を試す必要があります。
@Html.ActionLink("Test", "Foo2", "Main", new { uId = 12 }, null)