Cara yang benar untuk menggunakan _viewstart.cshtml dan sebagian tampilan Razor?

156

Saya menggunakan _viewstart.cshtml untuk secara otomatis menetapkan Layout Razor yang sama dengan pandangan saya.

Ini adalah file sederhana yang mati di root folder Views saya yang terlihat seperti ini:

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

Ini lebih KERING daripada menambahkan arahan @Layout ke setiap tampilan tunggal.

Namun, ini menimbulkan masalah bagi sebagian tampilan Razor , karena mereka menjalankan konten _viewstart.cshtml dan karena itu salah menempatkan tata letak sendiri, yang membuat mereka, um, tidak lagi parsial.

Berikut adalah proyek hipotetis, menampilkan file _viewstart.cshtml, file _layout.shtml bersama, dan tampilan sebagian ("AnonBar.cshtml").

Contoh struktur proyek

Saat ini, cara saya menyiasatinya adalah dengan menambahkan baris berikut ke setiap tampilan sebagian:

@{
    Layout = "";
}

Ini sepertinya cara yang salah untuk menunjukkan pandangan sebagai bagian dari Razor. (Perhatikan bahwa tidak seperti mesin tampilan formulir web, ekstensi file sama untuk tampilan sebagian.)

Pilihan lain yang saya pertimbangkan tetapi itu bahkan lebih buruk:

  • Menempatkan semua tampilan sebagian ke folder umum, sehingga mereka dapat membagikan _viewstart.cshtml umum. Ini mematahkan konvensi pandangan yang berada di folder yang sama dengan pengontrolnya.
  • Tidak menggunakan tampilan sebagian.

Apakah ini sesuatu yang masih disempurnakan oleh tim mesin tampilan Razor, atau apakah saya kehilangan konsep mendasar?

Portman
sumber
3
Maaf untuk offtopic, tetapi ikon apa yang ada di sebelah nama file? :) Semacam kontrol sumber kan?
Alex
6
@jitbit: VisualSVN
erict

Jawaban:

237

Jika Anda return PartialView()dari pengontrol Anda (bukan return View()), maka _viewstart.cshtmltidak akan dieksekusi.

marcind
sumber
6
Aha, tidak tahu tentang PartialViewResultkelas. Itulah yang saya butuhkan.
Portman
6
Sebagai tindak lanjut, saya telah menemukan bahwa saya perlu juga secara eksplisit mengatur tipe kembalinya metode tindakan PartialViewResultdaripada yang biasa ActionResult.
Portman
2
@ Portman, apakah Anda melihat masalah saat tipe pengembalian metode tindakan tidak ActionResult? Saya terkejut bahwa ini adalah masalah karena runtime MVC seharusnya tidak berperilaku berbeda dalam hal ini (yaitu selama jenis yang dikembalikan oleh metode tindakan adalah ActionResultatau setiap kelas yang diturunkan darinya hal-hal seharusnya hanya berfungsi).
marcind
@marcind saya mendapatkan Stack Overflow pada w3wp.exe jika saya mengatur jenis kembali ke ActionResult. Bekerja dengan baik jika tipe pengembaliannya PartialViewResult. Pikirkan saya perlu mengajukan bug Connect?
Portman
Apakah terdengar seperti saya - jangan berteriak kembali jika Anda mengirimkan bug Connect, akan memilih itu.
Dav