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?
Jawaban:
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
RazorViewEngine
danRazorView
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
sumber
_ViewStart
langsung di folder Area untuk menerapkannya ke semua area.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>
sumber
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 :)
sumber