Bagaimana cara menentukan nama area di tautan tindakan?

156

Saya memiliki halaman master bersama yang saya gunakan dari 2 area berbeda di aplikasi mvc 2 saya. Halaman master memiliki tautan tindakan yang saat ini menentukan pengontrol dan tindakan, tetapi tentu saja tautan itu tidak berfungsi jika saya berada di area yang salah. Saya melihat tidak ada overload untuk actionlink yang mengambil parameter area, apakah itu mungkin dilakukan?

Jeremy
sumber

Jawaban:

245

Menemukannya..

Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" }, new{})
Jeremy
sumber
3
@ Pure.Krome - ya. Tidak ada yang intuitif tentang itu!
Jeremy
3
Pastikan tidak ada ruang putih sebelum atau setelah Areaname. Kalau tidak, itu hanya akan mengabaikannya ... dan kemudian akan membuat Anda bertanya-tanya empat jam apa yang salah .. sama seperti saya.
Piotr Kula
Bagaimana Anda menambahkan parameter di sana?
Yorro
Bagaimana ini terlihat seperti diterjemahkan ke dalam tautan? Maksud saya - ketika formulir diberikan dan dikembalikan ke klien.
FrenkyB
79

Sesuatu yang saya temui tepat setelah ini, yang saya bayangkan orang lain mungkin temui: Jika Anda perlu menautkan dari dalam suatu area ke tindakan yang tidak ada dalam suatu area, Anda masih perlu menentukan Area sebagai string kosong.

Sebagai contoh, saya memindahkan beberapa kode MVC ke suatu area, dan menemukan saya perlu memperbarui url di halaman master yang mereferensikan halaman lain di situs.

Untuk menentukan url ke sesuatu yang tidak ada di suatu wilayah, gunakan

Html.ActionLink("home", "Index", new { area = "", controller = "Home" })
Frank Schwieterman
sumber
4
Ini tip yang sangat bagus! Tapi itu tidak memberikan hasil yang diharapkan dengan MVC 2 .. Koreksi kecil - Html.ActionLink ("home", "Index", new {area = "", controller = "Home"})
Alexander Beletsky
15

Menggunakan:

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

Catatan : parameter ke-4 adalah untuk melewati rute Values, jika Anda melewatkan parameter kosong maka akan mempertimbangkan struktur root dan jika Anda memberikan nilai yang sesuai, gunakan sebagai area.

Juga jangan lupa untuk menggunakan nullatau new{}sebagai parameter ke-5 karena melewati nullatau new {}saat membuat tautan tindakan tidak akan membebani metode untuk (text,action,controller,route data)atau (text,action,controller,route data,html attribute)jadi gunakan metode yang tepat

Subhash Rao
sumber
11

Dalam pemberian MVC2 area="root"bekerja untuk saya seperti di bawah ini

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

Trik rapi yang dapat Anda lakukan jika Anda menggunakan area yang banyak di Tampilan adalah mendefinisikannya sebagai variabel di atas:

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

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

Inilah yang saya kemukakan sebagai solusi untuk memungkinkan pengguna menautkan ke sistem otentikasi yang dibuat sebelumnya.

Setiap area saya memiliki versi file _LoginPartial.cshtml.

Saya mungkin bisa mendapatkan aplikasi untuk menggunakan versi file tunggal, namun saya terus mengalami kesalahan ketika mencoba menggunakan parsial login tunggal.

Ini hanya sedikit modifikasi pada loginpartial asli yang dihasilkan, tetapi tampaknya berfungsi dengan baik ketika digunakan di area tertentu.

Berikut adalah kode yang digunakan di dalamnya:

@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>
}
Anthony Hart
sumber
Pengaturan eksplisit htmlAttributes:bekerja dengan sangat baik untuk menggunakan beberapa parameter.
Travis J
2

Jika Anda tidak dapat menggunakan tautan aplikasi web standar seperti About, Home, Contac dll dari area. Anda mengubah baris

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

dari

Tampilan \ Shared_Layout.cshtml

ErdincDonmez
sumber
1

Di aplikasi ASP Net Core saya, saya cukup menambahkan area ke atribut html seperti:

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

Menggunakan

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

Akan mencapai apa yang Anda cari.

DisplayText adalah apa yang akan ditampilkan (sama seperti <a href="#">DisplayText</a>), ActionName adalah metode yang dipanggil dalam controller dan ControllerName jelas merupakan controller yang ingin Anda panggil! Parameter berikutnya adalah 'Nilai Rute' tempat Anda akan menambahkan area Anda. Jika Anda saat ini berada di suatu Area dan ingin menavigasi kembali ke root Anda Home/Indexmisalnya, Anda akan meninggalkan nilai sebagai string kosong, misalnya new { area = ""}. Nilai akhir adalah 'Atribut Html' dan di mana Anda akan menambahkan kelas jika Anda mau dan harus menjadi nulljika tidak memiliki atribut untuk ditambahkan. Tetapi sebagai parameter terakhir dilihat sebagai 'Atribut Html'; agar Nilai Rute diakui, ini harusnull

Rob P
sumber