アクションリンクでエリア名を指定する方法は?


156

mvc 2アプリの2つの異なる領域から使用している共有マスターページがあります。マスターページには、現在コントローラーとアクションを指定するアクションリンクがありますが、もちろん、リンクが間違っている場合、リンクは機能しません。areaパラメータを取るactionlinkのオーバーロードはありません。それは可能ですか?

回答:


245

理解した..

Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" }, new{})

3
@ Pure.Krome-はい。それについて直感的なことは何もありません!
ジェレミー

3
Areanameの前後に空白がないことを確認してください。そうでなければ、それは単にそれを無視します...そして、あなたは4時間何が間違っているのか不思議に思うでしょう...ちょうど私のように。
Piotr Kula 2013年

そこにどのようにパラメーターを追加しますか?
Yorro 2015

これはリンクに翻訳されたように見えますか?つまり、フォームがレンダリングされてクライアントに返されるときです。
FrenkyB 2017

79

この直後に遭遇した何か、他の人が遭遇する可能性があると思います:エリア内からエリア外のアクションにリンクする必要がある場合でも、エリアを空の文字列として指定する必要があります。

たとえば、一部のMVCコードを領域に移動したところ、サイトの他のページを参照するマスターページのURLを更新する必要があることがわかりました。

エリアにないものへのURLを指定するには、

Html.ActionLink("home", "Index", new { area = "", controller = "Home" })

4
これは非常に良いヒントです!しかし、MVC 2では予期しない結果が生じます。小さな修正-Html.ActionLink( "home"、 "Index"、new {area = ""、controller = "Home"})
Alexander Beletsky

15

使用する:

 Html.ActionLink("Text", "ActionName", "ControllerName", new { Area = "AreaName" }, null)

:4番目のパラメータはrouteを渡すValuesことです。空のパラメータを渡すとルート構造と見なされ、適切な値を渡すとそれを領域として使用します。

また、使用することを忘れないでくださいnullまたはnew{}渡すために第五パラメータとして、nullまたはnew {}アクションリンクを作成しばらくメソッドをオーバーロードしないであろう(text,action,controller,route data)か、その(text,action,controller,route data,html attribute)ように適切なメソッドを使用します


11

MVC2では、ギビングarea="root"は以下のように私のために働きました

Html.ActionLink("Home", "Index", "Home", new { Area = "root" }, new{})

6

ビューで多くの領域を使用している場合にできる巧妙なトリックは、それを上部の変数として定義することです。

@{ var awesomeArea = new { area = "Awesome" }; }

@Html.Action("Something", "Somewhere", awesomeArea)
@Html.ActionLink("Stuff", "FooBar", awesomeArea)

4

これは、ユーザーが事前に構築された認証システムにリンクできるようにするためのソリューションとして私が思いついたものです。

私の各エリアには、_LoginPartial.cshtmlファイルのバージョンがあります。

おそらく、アプリケーションでファイルの単一バージョンを使用することはできますが、単一ログインパーシャルを使用しようとすると、エラーが発生し続けました。

元の生成されたloginpartialにわずかな変更を加えただけですが、特定の領域で使用するとうまく機能するようです。

これらすべてで使用されるコードは次のとおりです。

@if (Request.IsAuthenticated)
{
    <text>
    Hello, @Html.ActionLink(User.Identity.Name, "Manage", "Account", new { area = "" }, htmlAttributes: new { @class = "username", title = "Manage" })!
    @using (Html.BeginForm("LogOff", "Account", new { area = "" }, FormMethod.Post, new { id = "logoutForm" }))
 {
        @Html.AntiForgeryToken()
        <a href="javascript:document.getElementById('logoutForm').submit()">Log off</a>
 }
    </text>
}
else
{
    <ul>
        <li>@Html.ActionLink("Register", "Register", "Account", new { area = "" }, htmlAttributes: new { id = "registerLink" })</li>
        <li>@Html.ActionLink("Log in", "Login", "Account", new { area = "" }, htmlAttributes: new { id = "loginLink" })</li>
    </ul>
}

明示的に設定すると、htmlAttributes:複数のパラメーターを使用する場合に非常に効果的です。
Travis J

2

地域から、About、Home、Contacなどの標準のWebアプリケーションリンクを使用できない場合。あなたは行を変える

@Html.ActionLink("Ana Sayfa", "Index", "Home", new { area = "" }, new {})

から

Views \ Shared_Layout.cshtml


1

私のASP Net Coreアプリでは、次のように領域をhtml属性に追加するだけです。

@Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" , id = @Model.ID, name = @Model.name })

0

使用する

@Html.ActionLink("DisplayText", "ActionName", "ControllerName", new { area = "AreaName"}, null)

あなたが求めているものを達成します。

DisplayTextは何を表示するか(と同じ<a href="#">DisplayText</a>)、ActionNameはコントローラーで呼び出されるメソッド、ControllerNameは明らかに呼び出すコントローラーです!次のパラメータは、エリアを追加する「ルート値」です。現在エリアにいて、ルートなどに戻るHome/Index場合は、値を空の文字列(例:)のままにしますnew { area = ""}。最後の値は 'Html Attributes'であり、必要に応じてクラスnullを追加します。追加する属性がない場合は、ここに追加する必要があります。しかし、最後のパラメーターは 'Html Attributes'として表示されるため、ルート値が認識されるためには、これはnull

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.