web-dev-qa-db-ja.com

URLで?length = 7を自動生成するRazor actionlink?

かみそりのページに以下のリンクがあります:

@Html.ActionLink("Create New Profile", "Create", "Profile", new { @class="toplink" })

以下に示すように、ビューページのソースに表示されます。

<a href="/admin/profile/create?length=7" class="toplink">Create New Profile</a>

リンクをクリックすると、URLは次のようになります。

http://localhost:54876/admin/profile/create?length=7

?length=7。なぜこの自動生成されるのですか?

55
Pirzada

使用しているActionLinkオーバーライドは、 (string linkText、string actionName、Object routeValues、Object htmlAttributes) オーバーライドと一致します。したがって、「プロファイル」値はrouteValuesパラメーターに渡されます。このパラメーターに関するこの関数の動作は、すべてのパブリックプロパティを取得し、リンクの生成に使用されるルート値のリストに追加することです。 Stringにはパブリックプロパティ(長さ)が1つしかないため、「length = 7」になります。

使用する正しいオーバーロードは (string linkText、string actionName、string controllerName、Object routeValues、Object htmlAttributes) であり、次のように呼び出します:

@Html.ActionLink("Create New Profile", "Create", "Profile", new {}, new { @class="toplink"})
88
marcind

これの正確な原因はわかりませんが、次のように変更します。

@Html.ActionLink("Create New Profile", "Create", "Profile", new {}, new { @class="toplink" })

最後のパラメーター(htmlattributesが追加されたパラメーター)をオフにしたときにMVCがどのオーバーロードを選択しているかはわかりませんが、それで修正されます。これらの日のうちの1つを調査し、何が起こっているのかを正確に把握します。

7
Matt Sieker

注意すべきもう1つのことは、コントローラーを@ActionLinkで定義しているためです。たとえば、「新しいプロファイルの作成」@ActionLinkが表現されるビューは、 /admin/profile/index.cshtml」、既存のプロファイルをリストするビュー。この場合、@ActionLinkProfileControllerに既に関連しているため、@ActionLinkでコントローラーを定義する必要はありません。あなたの@ActionLink

@Html.ActionLink("Create New Profile", "Create", null, new { @class="toplink" })

マークされた答えがするように、new{}の代わりにnullを使用しました。これは私自身がより適切だと思います。 ActionLinkのオーバーロードは、これまでで最も簡単なことではありません。

0
Brian Ogden