Mengapa Razor _layout.cshtml memiliki garis bawah utama dalam nama file?

144

Dalam proyek ASP.NET MVC 3 default, tata letak & file cshtml parsial mulai dengan garis bawah

  • _viewstart
  • _Layout
  • _LogOnPartial

Mengapa konvensi ini, dan untuk apa ini digunakan? Apakah saya perlu mengikuti konvensi ini?

Apakah kerangka kerja memberikan makna khusus pada .cshtmlfile yang dimulai dengan garis bawah?

richb
sumber
Saya menggunakan NancyFX dengan Razor dan karena secara default membatasi konten yang tidak ada dalam folder Konten. (Ini dapat ditimpa di web.config atau custom config) tidak mungkin melayani semua file seperti .cshtml secara langsung. Jadi saya tidak menggunakan "_" yang ditambahkan ke nama tampilan saya karena itu TIDAK perlu dan jelek.
Norbert Norbertson

Jawaban:

205

Razor dikembangkan untuk ASP.NET Web Pages (WebMatrix), yang tidak memiliki perlindungan yang sama terkait folder Views dan Routing yang Anda dapatkan dalam MVC. Karena halaman tata letak di Halaman Web tidak dimaksudkan untuk dilayani secara langsung, mereka diawali dengan garis bawah. Dan kerangka Halaman Web telah dikonfigurasi untuk tidak mengizinkan file dengan garis bawah terkemuka di namanya diminta secara langsung. File .cshtml lainnya dalam Halaman Web umumnya harus dapat dijelajahi. Itu setara dengan file .asp atau .php.

Tim ASP.NET telah menyatakan bahwa Halaman Web adalah titik awal dalam pengembangan ASP.NET, yang akan mengarah pada migrasi ke MVC pada waktunya (bagi mereka yang ingin melanjutkan). Sebagian dari itu berarti semudah mungkin untuk bermigrasi dari Halaman Web ke MVC. Akibatnya, masuk akal untuk membawa konvensi penamaan yang ditetapkan dalam Halaman Web ke file MVC Razor.

Jadi ada adalah alasan teknis untuk awalan nama file dengan tanda garis bawah - itu hanya tidak relevan dengan MVC.

[UPDATE Oktober 2018]

Dalam kerangka ASP.NET Core Razor Pages yang baru (selain dalam versi 2.1), file dengan garis bawah terkemuka diabaikan ketika rute dibuat saat startup - bahkan jika mereka memiliki @pagearahan (yang biasanya menjadikannya Halaman Razor yang dapat dilewati) . Itu sebabnya masuk akal untuk memberi nama tata letak dan sebagian file dengan garis bawah terkemuka dalam aplikasi Halaman Razor jika tidak dimaksudkan untuk diramban.

Mike Brind
sumber
6
Terima kasih. Bagi saya ini adalah jawaban yang paling mendalam. Saya berada di bawah kesalahpahaman bahwa Razor terikat pada MVC. Sekarang saya melihat alasan untuk garis bawah utama adalah untuk mencegah mereka dilayani langsung di bawah ASP.NET Web Pages.
richb
1
Sebuah konvensi penamaan yang sebenarnya memiliki fungsi yang terkait, saya pikir MS akan tahu lebih baik. Dan sekarang itu dibawa ke MVC, yang seharusnya menjadi batu tulis yang bersih.
Boris B.
Mudah-mudahan setelah rilis .NET Framework 4.5.1 dan Visual Studio 2013 saat ini termasuk fungsionalitas "One ASP.NET" mereka akhirnya dapat menjauh dari batasan teknis / hard-coding ini. Tentu saja memiliki file standar yang tidak pernah dibagikan sangat penting seperti pada direktori * .config, APP_Code, dan APP_Data saat ini. Tetapi logika ini harus diletakkan di file konfigurasi di suatu tempat (konfigurasi mesin sebagai default) sehingga dapat diganti. Juga nama-nama standar dari halaman umum ini harus dapat dikonfigurasi (Layout / Error / etc ...).
Tony Wall
1
@ Daniel Oh, saya mengerti maksud Anda. Saya telah mengedit jawaban karena tidak berfungsi seperti yang diiklankan.
Mike Brind
1
@Daniel Apa yang Anda lihat ternyata adalah bug yang muncul di Razor Pages 2.1. Ini dijadwalkan diperbaiki pada 2.2. Ini berfungsi seperti yang saya jelaskan di 2.0.
Mike Brind
12

Begitulah Ruby on Rails melakukannya (Partial memulai dengan _ tetapi panggilan Render Partial tidak termasuk _), dan ASP.net MVC telah mengambil inspirasi besar darinya.

Tidak ada alasan teknis sebenarnya, hanya sebuah konvensi untuk secara jelas menunjukkan maksud kepada pengembang lain (dan diri Anda sendiri 6 bulan kemudian) untuk mengatakan: Ini adalah pandangan sebagian.

Michael Stum
sumber
ini salah, seperti yang ditunjukkan oleh jawaban di atas - garis bawah memiliki fungsi keamanan.
iJungleBoy
1
@ iJungleBoy Lihat jawaban yang diterima. untuk ASP.net MVC (yang membahas pertanyaan ini), tidak ada fungsi keamanan. Lihat web.config di folder Views yang sudah memblokir semua file cshtml dan aspx, garis bawah atau tidak (set up System.Web.HttpNotFoundHandleruntuk mereka).
Michael Stum
7

Halaman yang tidak dapat ditampilkan oleh permintaan langsung dari browser Anda (halaman master, sebagian tampilan dll) memiliki garis bawah (_) di awal nama mereka.

Jadi jika Anda mencoba membuat permintaan ke _Layout.cshtml (ini adalah halaman master) Anda akan mendapatkan kesalahan dari server.

Ini adalah cara untuk membedakan file yang tidak dapat diakses sebagai halaman yang berdiri sendiri, di Razor view engine.

Pikirkan seperti ini ... di MVC 2 ... Anda akan membedakan tampilan parsial dan master dengan sufix .master, .ascx, dan halaman normal adalah .aspx, di sisi lain, dalam tampilan Razor ... semua tampilan adalah .cshtml, jadi untuk membedakan sebagian dan halaman utama mereka akan memiliki awalan (_). tidak ada yang wajib, hanya "konvensi".

Juztin
sumber
4
Tetapi dengan logika itu, SEMUA file cs & cshtml tidak akan diawali dengan garis bawah?
richb
jika semua file memiliki _ sebagai awalan maka situs Anda tidak akan berfungsi ... file yang memiliki _prefix dirender di dalam halaman normal ... (untuk sebagian), dan sitemaster adalah templat ... sehingga harus memiliki konten untuk ditampilkan
Juztin
Jadi saya baru saja mencoba ini, dan IIS di kotak saya tidak melayani file apa pun dari direktori Views. File .html bahkan tidak statis. Jadi saya benar-benar tidak berpikir ini jawabannya.
richb
Juztin: Pertanyaannya adalah mengapa mereka mulai dengan garis bawah? Jika saya mengganti nama _Layout.cshtm menjadi Layout.cshtml masih berfungsi dengan baik. Jadi apa alasan konvensi ini?
richb
2
Pertanyaannya adalah tentang asp.net mvc, bukan halaman web
fabspro
2

Sejauh yang saya tahu ini hanyalah sebuah konvensi yang digunakan untuk mengidentifikasi maksud file; Saya tidak percaya itu benar-benar akan mengubah perilaku file. Dalam sebagian besar konteks pengembangan, menambahkan garis bawah mengidentifikasi sesuatu yang dimaksudkan untuk penggunaan "pribadi", baik oleh kelas, atau dalam hal ini, templat lain.

masa depan
sumber
1

Saya tidak menggunakan MVC, tetapi dengan halaman web yang juga menggunakan sintaks silet, awalan _ umumnya menandakan bahwa halaman tersebut tidak dimaksudkan untuk diakses oleh pengguna tetapi oleh halaman lain atau kode tertentu. Jika Anda mencoba menavigasi ke halaman yang berisi _prefix, asp.net akan mencegah akses ke sana. Itulah mengapa ini digunakan dengan halaman tata letak dan halaman semacam itu karena tidak boleh diakses langsung oleh pengguna.

Sesuatu seperti folder App_Code di asp.net

Travis
sumber
@MikeBrind Anda tidak dapat 'menavigasi' ke / menelusuri langsung salah satu dari pandangan /viewdi bawah dalam proyek ASP.NET MVC default; yang /views/web.configfile dibentuk untuk mencegahnya. Tapi tidak ada yang mencegah tindakan pengontrol untuk kembali. View("_Index", model);Ini berfungsi dengan baik; Saya hanya melakukannya dengan mengubah nama tampilan menjadi _Index.cshtml dan mengubah tindakan untuk memanggil seperti yang saya lakukan di atas.
Andrew Barber
@ MikeBrind Pertanyaan ini tentang MVC, bukan Halaman Web. Diberikan; Saya tidak menyebutkannya dalam komentar asli saya.
Andrew Barber
@MikeBrind Saya - dan saya - merespons jawaban ini . Bukan milikmu. Komentar awal saya menyesatkan (saya juga menyebutkan "sebagian"), jadi saya telah menghapusnya. Maksud saya adalah dan bahwa garis bawah tidak ada hubungannya dengan tidak dapat memuat tampilan di MVC. Pengguna ini bahkan mulai berkata, "Saya tidak menggunakan MVC", namun pertanyaan ini adalah tentang MVC. Aku hanya memastikan seseorang datang bersama kemudian membaca ini jawabannya tidak entah bagaimana berpikir bahwa di MVC, garis bawah mempengaruhi kemampuan aksi kontroler untuk memuat tampilan. Bukan masalah besar. Kami setuju saya tidak tahu bagaimana saya berbicara. Selesai
Andrew Barber