Html.ActionLinkを使用して別のコントローラーでアクションを呼び出す


224

を使用してコントローラ間を移動しようとしていActionLinkます。問題を例を挙げて説明します。

私はハットコントローラーのインデックスビューで、以下のコードを使用して製品コントローラーの詳細アクションへのリンクを作成しようとしています。

<%= Html.ActionLink("Details", "Details", "Product", new { id=item.ID }) %>

これにより、製品コントローラーの詳細へのリンクを作成する代わりに、ハットコントローラーで詳細アクションへのリンクを生成し、その最後に長さパラメーターを追加します。

Hat/Details/9?Length=7

HTML.ActionLinkこの問題が原因で、を使用してコントローラを切り替えることができません。私が間違っていることを指摘していただければ幸いです。ありがとう

PS:MVCに付属するデフォルトのルート設定を使用しています

routes.MapRoute("Default", "{controller}/{action}/{id}", 
                     new { controller = "Home", action = "Index", id = "" } );

回答:


409

あなたが望むのはこの過負荷です:

//linkText, actionName, controllerName, routeValues, htmlAttributes
<%=Html.ActionLink("Details", "Details", 
    "Product", new {id = item.ID}, null) %>

1
この特定のオーバーロードが機能し、korkiが機能しない理由を説明できますか?htmlAttributesをnullに設定すると、リンクのルーティングにどのような影響がありますか?
Derek Hunziker、2010

35
これは、他のパラメーターを使用する場合、3番目の引数がroutevaluesであり、4番目の引数がhtmlattributesであると想定しているためです。5番目の引数を追加すると、メソッドは正しいオーバーロードを使用する必要があります。インテリセンスのオーバーロードをフリックすると、これはより理にかなっています。
バンフォード、2011

2
ActionLinkのオーバーロードは本当に不格好です。RouteValueCollectionの代わりに 'object routeValues'を受け入れる全体のポイントは、入力の量を減らすことです。ただし、余分なnullを入力する必要があります。非直感的で生産性に
欠ける

3
私は同意します。過負荷パラメータは設計が不十分です。それは長い間バグであると思いました。間違った署名を使用していたことを理解するために、私は本当に9回目のインテリセンスを凝視しなければなりませんでした
Bkwdesign

1
将来の読者のために、この問題が発生し、CSSスタイルを追加しようとしている場合、これは正しいオーバーロードです。@ Html.ActionLink( "MyText"、 "MyAction"、 "MyController"、null、new {@class = "myClass"})
granadaCoder

17

そのパラメーターを使用すると、間違ったオーバーロードされた関数/メソッドがトリガーされます。

私のために働いたもの:

<%= Html.ActionLink("Details", "Details", "Product", new { id=item.ID }, null) %>

HtmlHelper.ActionLink(string linkText、string actionName、string controllerName、object routeValues、object htmlAttributes)を起動します

MVC 4を使用しています。

チェリオ!


2
コード行は、言及したオーバーロードをトリガーしませんが、HtmlHelper.ActionLink(string linkText、string actionName、object routeValues、object htmlAttributes)をトリガーします。これは、OPが回避しようとしていた同じ結果をもたらします。追加のnullパラメータを追加する必要があります。
TiMoch 2013年

TiMochに感謝します。
ステファンベンター

12

わかりやすくするために、次のように名前付きパラメーターを使用してこれらのヘルパーを作成することをお勧めします。

@Html.ActionLink(
    linkText: "Details",
    actionName: "Details",
    controllerName: "Product",
    routeValues: new {
        id = item.ID
    },
    htmlAttributes: null
)

2019年の時点で、この機能はJetBrainsによってReSharperに実装されています。この状況では実際に非常に役立ちます。
ジェイミー

10

MVC Futuresアセンブリ(私が強くお勧めします)を取得した場合は、ActionLinkとラムダを作成するときにジェネリックを使用してルートを構築できます。

<%=Html.ActionLink<Product>(c => c.Action( o.Value ), "Details" ) %>

ここで先物アセンブリを取得できます。http//aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId = 24471


実際のリンクをありがとう-それを見つけようとしていた!
ペルヘンティアン

1
ただし、MVC2には含まれていないため、注意が必要です。推論は、アクションは必ずしもメソッドではないということです(私は同意しますが、しばらくの間ジェネリックメソッドを使用してきたため、移行するのは面倒になるでしょう)。2に保持されない理由についての完全な記事は次のとおり
Stu

7

ActionLinkのオーバーロードが間違っている。代わりにこれを試してください。

<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %>


3

別の解決策は、Urlヘルパーオブジェクトを使用して次のようにタグのhref属性を設定することです<a>

<a href="@Url.Action("Details", "Product",new { id=item.ID }) )">Details</a>

1

詳細は「製品」フォルダの下の「表示」ページであることに注意してください。

ProductIdはテーブルの主キーです。Index.cshtmlの行は次のとおりです

 @Html.ActionLink("Details", "Details","Products" , new  {  id=item.ProductId  },null)

0

このコードは私にとって部分的に機能しました:

<a href="/Content/Index?SubCategoryId=@item.Id">@item.Title</a>

これは機能しますが、ActionLinkを使用する全体のポイントを回避します... ActionLinkの全体のポイントは、手動でURLを入力することと作成できる潜在的な問題を回避することです
Jon Story
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.