Paksa semua Area untuk menggunakan Tata Letak yang sama

88

Saya memiliki struktur proyek berikut:

  • / Views / Shared / _Layout;

  • / Area / Area1 / Tampilan / Nama Pengontrol / Indeks;

...

  • / Area / AreaN / Tampilan / Nama Pengontrol / Indeks.

Apakah ada cara untuk memaksa semua area menggunakan _Layout sebagai tata letak dasar ?

Apakah ada cara untuk melakukannya tanpa menambahkan file _ViewStart (misalnya, melalui konfigurasi perutean)?

Lihat juga:

Bagaimana cara menentukan tata letak yang berbeda di file ViewStart pisau cukur ASP.NET MVC 3?

Mikhail
sumber
Ini satu jawaban yang bagus dan yang lainnya
Rafael Emshoff

Jawaban:

157

Anda hanya perlu menambahkan file bernama:

_ViewStart.cshtml

Di bawah setiap folder tampilan area:

/Areas/Area1/Views/_ViewStart.cshtml

Dan edit file untuk mengarah ke tata letak root seperti ini:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Agar ini berfungsi, Anda tidak perlu menentukan nilai dalam properti tata letak tampilan, jika Anda melakukannya, Anda akan mengganti tata letak global

Catatan: Seperti yang disebutkan Tony, Anda bisa mengedit properti layout setiap tampilan agar mengarah ke layout root, namun ini bukan cara yang disarankan untuk melakukannya karena Anda akan menggabungkan tampilan dengan layout Anda dan mengubahnya akan menyakitkan

Edit 1

Jika Anda ingin menggunakan kode untuk menyetel tata letak tampilan default, mungkin Anda harus mempertimbangkan untuk menulis mesin tampilan kustom.

Coba google tentang custom RazorViewEnginedanRazorView

Artikel ini bisa menjadi titik awal yang baik

http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx

Saya belum melakukan hal seperti ini tetapi saya harap saya mengarahkan Anda ke arah yang benar

Jupaol
sumber
1
Apakah ada cara untuk melakukannya tanpa menambahkan file "_ViewStart" (misalnya, melalui konfigurasi perutean)?
Mikhail
2
Dalam perutean, saya rasa tidak. Mereka adalah dua hal yang berbeda. Perutean bertugas untuk mencoba mencocokkan URL permintaan saat ini dengan rute yang terdaftar di RoutesTable, ketika kecocokan ditemukan, IMvcRouteHandler dibuat dan kemudian IHttpHandler (MvcHandler) bertanggung jawab untuk memproses tindakan pengontrol Anda. Seperti yang Anda lihat, ini tidak ada hubungannya dengan tampilan atau tata letak. Ini karena rute tidak perlu mengembalikan tampilan, ia bisa mengembalikan json atau xml. Jadi perutean bukanlah tempat yang tepat untuk mengimplementasikan sesuatu seperti ini.
Jupaol
Anda juga dapat menambahkan _ViewStartlangsung di folder Area untuk menerapkannya ke semua area.
Artur
21

Memperluas jawaban oleh Jupaol ....

Setidaknya di VS2013, file _ViewStart.cshtml ditambahkan secara default saat membuat area, jadi sudah ada di sana, dan Anda dapat mengubah isinya saat dia mencatat untuk menunjuk ke _Layout.cshtml root. Anda kemudian dapat menghapus _Layout.cshtml di area tersebut, karena tidak lagi digunakan (dan berpotensi menjadi sumber kebingungan sekarang)

Namun, dengan melakukan perutean apa pun yang dilakukan di root _Layout.cshtml itu perlu mempertimbangkan area.
_Layout.cshtml default memiliki sejumlah pembantu ActionLink yang perlu sedikit modifikasi:

Tambahkan parameter RouteValueDictionary ke panggilan ActionLink apa pun dengan menyetel Area = "". Perhatikan bahwa string kosong mengacu pada level root. Ini akan memungkinkan tautan ini berfungsi dengan benar saat dipanggil dari dalam suatu area, masih berfungsi saat dipanggil dari akar.

misalnya:

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>
Rob Campbell
sumber
2

Anda menentukan tata letak menggunakan:

@ {Tata Letak = "_Layout"; }

Jika Anda ingin membuatnya lebih mudah, ubah semuanya sekaligus. Mungkin Anda bisa mengaturnya sebagai variabel view bag dan menyebarkannya ke controller. Untuk membuatnya lebih mudah, Anda dapat membuat pengontrol dasar yang diwarisi oleh pengontrol lain dan menetapkan tata letak ke view bag di sana.

Tidak yakin mengapa perutean perlu diubah atau mungkin saya tidak mengerti. Semoga ini membantu :)

Tony
sumber