เหตุใดมีดโกน _layout.cshtml จึงมีขีดล่างนำในชื่อไฟล์


144

ในโครงการ ASP.NET MVC 3 ที่เป็นค่าเริ่มต้นไฟล์เลย์เอาต์และ cshtml บางส่วนเริ่มต้นด้วยการขีดเส้นใต้

  • _viewstart
  • _Layout
  • _LogOnPartial

ทำไมการประชุมนี้และสิ่งนี้ใช้ทำอะไร? ฉันจำเป็นต้องทำตามอนุสัญญานี้หรือไม่?

เฟรมเวิร์กให้ความหมายพิเศษกับ.cshtmlไฟล์ที่ขึ้นต้นด้วยขีดล่างหรือไม่?


ฉันใช้ NancyFX กับมีดโกนและโดยปกติแล้วจะ จำกัด เนื้อหาที่ไม่ได้อยู่ในโฟลเดอร์เนื้อหา (สามารถแทนที่ได้ใน web.config หรือกำหนดค่าแบบกำหนดเอง) เป็นไปไม่ได้ที่จะให้บริการไฟล์ใด ๆ เลยเช่น. cshhtml โดยตรง ดังนั้นฉันจึงไม่ใช้ "_" ต่อท้ายกับชื่อมุมมองของฉันเพราะมันไม่จำเป็นและน่าเกลียด
Norbert Norbertson

คำตอบ:


205

Razor ได้รับการพัฒนาสำหรับ ASP.NET เว็บเพจ (WebMatrix) ซึ่งไม่มีการป้องกันประเภทเดียวกันในตัวเกี่ยวกับโฟลเดอร์ Views และการกำหนดเส้นทางที่คุณได้รับภายใน MVC เนื่องจากหน้าเลย์เอาต์ในเว็บเพจไม่ได้ตั้งใจให้บริการโดยตรงหน้าเหล่านั้นจะถูกนำหน้าด้วยเครื่องหมายขีดล่าง และเฟรมเวิร์กเว็บเพจได้รับการกำหนดค่าไม่ให้อนุญาตไฟล์ที่มีขีดเส้นใต้นำในชื่อของพวกเขาจากการร้องขอโดยตรง โดยทั่วไปไฟล์. cshhtml อื่น ๆ ในเว็บเพจจะต้องสามารถเรียกดูได้ พวกมันเทียบเท่ากับไฟล์. asp หรือ. php

ทีม ASP.NET ระบุว่าหน้าเว็บเป็นจุดเริ่มต้นในการพัฒนา ASP.NET ซึ่งควรนำไปสู่การโยกย้ายไปยัง MVC ในเวลา (สำหรับผู้ที่ต้องการย้ายไป) ส่วนหนึ่งของนั้นหมายความว่าควรจะง่ายที่สุดในการโยกย้ายจากหน้าเว็บไปยัง MVC ดังนั้นจึงเหมาะสมที่จะดำเนินการผ่านการตั้งชื่อแบบแผนที่จัดตั้งขึ้นภายในไฟล์เว็บเพจไปยังไฟล์ MVC มีดโกน

ดังนั้นจึงมีเป็นเหตุผลทางเทคนิคสำหรับ prefixing ชื่อไฟล์ที่มีการขีดเส้นใต้ - มันก็ไม่เกี่ยวข้องกับ MVC

[อัพเดทตุลาคม 2561]

ในเฟรมเวิร์ก ASP.NET Core Razor Pages ใหม่ (นอกเหนือจากในเวอร์ชัน 2.1) ไฟล์ที่มีเครื่องหมายขีดเส้นใต้จะถูกละเว้นเมื่อสร้างเส้นทางเมื่อเริ่มต้น - แม้ว่าพวกเขาจะมี@pageคำสั่ง . นั่นเป็นเหตุผลที่ทำให้การกำหนดชื่อและไฟล์บางส่วนที่มีขีดล่างชั้นนำในแอปพลิเคชั่นหน้ามีดโกนถ้าพวกเขาไม่ได้ตั้งใจที่จะเรียกดู


6
ขอบคุณ สำหรับฉันนี่คือคำตอบที่ชาญฉลาดที่สุด ฉันอยู่ภายใต้การเข้าใจผิดที่มีดโกนเชื่อมโยงกับ MVC ตอนนี้ฉันเห็นสาเหตุของการขีดเส้นใต้ชั้นนำคือการป้องกันไม่ให้มีการให้บริการโดยตรงภายใต้ ASP.NET เว็บเพจ
richb

1
หลักการตั้งชื่อที่มีฟังก์ชั่นเชื่อมโยงกันอยู่ฉันคิดว่า MS น่าจะรู้จักดีกว่า และตอนนี้มันถูกส่งไปที่ MVC ซึ่งควรจะเป็นกระดานชนวนที่สะอาด
Boris B.

หวังว่าหลังจากรุ่นปัจจุบันของ. NET Framework 4.5.1 และ Visual Studio 2013 รวมถึงฟังก์ชั่น "One ASP.NET" พวกเขาสามารถย้ายออกจากข้อ จำกัด ทางเทคนิค / การเข้ารหัสฮาร์ดไดรฟ์เหล่านี้ได้ แน่นอนว่าการมีไฟล์มาตรฐานไม่เคยถูกแชร์เป็นสิ่งจำเป็นเช่นเดียวกับไดเรกทอรี * .config, APP_Code และ APP_Data แต่ตรรกะนี้ควรอยู่ในไฟล์กำหนดค่าบางแห่ง (ค่าคอนฟิกของเครื่องเป็นค่าเริ่มต้น) เพื่อให้สามารถแทนที่ได้ ควรตั้งชื่อเริ่มต้นเหล่านี้ของหน้าเว็บทั่วไป (เลย์เอาต์ / ข้อผิดพลาด / ฯลฯ ... )
Tony Wall

1
@Daniel โอ้ฉันเห็นความหมายของคุณ ฉันได้แก้ไขคำตอบเพราะมันไม่ทำงานตามที่โฆษณาไว้
Mike Brind

1
@Daniel สิ่งที่คุณเห็นเป็นข้อผิดพลาดที่ปรากฏใน Razor Pages 2.1 มีกำหนดจะแก้ไขใน 2.2 มันทำงานได้ตามที่ฉันอธิบายไว้ใน 2.0
Mike Brind

12

นั่นเป็นวิธีที่ Ruby on Rails ทำ (ส่วนเริ่มต้นด้วย _ แต่การโทร Render Partial ไม่รวม _) และ ASP.net MVC ได้รับแรงบันดาลใจอย่างหนักจากมัน

ไม่มีเหตุผลทางเทคนิคจริงๆเพียงแค่การประชุมเพื่อแสดงให้เห็นเจตนาที่ชัดเจนต่อนักพัฒนาคนอื่น ๆ (และตัวคุณเอง 6 เดือนต่อมา) ที่จะพูดว่า: นี่เป็นมุมมองบางส่วน


สิ่งนี้ไม่ถูกต้องตามที่ระบุไว้โดยคำตอบข้างต้น - ขีดล่างมีฟังก์ชั่นความปลอดภัย
iJungleBoy

1
@iJungleBoy ดูคำตอบที่ยอมรับได้ สำหรับ ASP.net MVC (ซึ่งคำถามนี้เกี่ยวกับ) ไม่มีฟังก์ชั่นความปลอดภัย ดู web.config ในโฟลเดอร์ Views ที่ปิดกั้นไฟล์ cshtml และ aspx ทั้งหมดแล้วขีดเส้นใต้หรือไม่ (ตั้งค่าSystem.Web.HttpNotFoundHandlerสำหรับพวกเขา)
Michael Stum

7

หน้าที่ไม่สามารถแสดงได้โดยการร้องขอโดยตรงจากเบราว์เซอร์ของคุณ (หน้าต้นแบบ, มุมมองบางส่วน ฯลฯ ) มีขีดล่าง (_) ในตอนต้นของชื่อ

ดังนั้นหากคุณพยายามที่จะขอ _Layout.cshtml (นี่คือหน้าหลัก) คุณจะได้รับข้อผิดพลาดจากเซิร์ฟเวอร์

มันเป็นวิธีการแยกไฟล์ที่ไม่สามารถเรียกดูเป็นหน้าแบบสแตนด์อะโลนได้ในเครื่องมือของมีดโกน

คิดแบบนี้ ... ใน MVC 2 ... คุณจะแยกความแตกต่างของมุมมองบางส่วนและ mastersite ด้วย sufix .master, .ascx และหน้าปกติเป็น. aspx ในทางกลับกันในมุมมองมีดโกน ... มุมมองทั้งหมดคือ. cshtml ดังนั้นเพื่อแยกความแตกต่างบางส่วนและเป็นหน้าต้นแบบพวกเขาจะมีคำนำหน้า (_) ไม่มีสิ่งใดบังคับเพียงแค่ "การประชุม"


4
แต่โดยตรรกะนั้นไฟล์ cs & cshtml จะไม่ถูกนำหน้าด้วยขีดล่างทั้งหมดหรือไม่
richb

หากไฟล์ทั้งหมดจะมี _ เป็นคำนำหน้าเว็บไซต์ของคุณจะไม่ทำงาน ... ไฟล์ที่มี _prefix จะแสดงผลในหน้าปกติ ... (สำหรับงาน partials) และ sitemaster เป็นแม่แบบ ... ดังนั้นจึงต้องมีเนื้อหาเพื่อ จะปรากฏขึ้น
Juztin

ดังนั้นฉันจึงลองทำเช่นนี้และ IIS บนกล่องของฉันจะไม่ให้บริการไฟล์ใด ๆ จากไดเรกทอรี Views ไม่แม้แต่ไฟล์. html คงที่ ดังนั้นฉันไม่คิดว่านี่เป็นคำตอบ
richb

Juztin: คำถามคือทำไมพวกเขาเริ่มต้นด้วยการขีดเส้นใต้? ถ้าฉันเปลี่ยนชื่อ _Layout.cshtm เป็น Layout.cshtml ก็ยังใช้ได้ดี ดังนั้นเหตุผลสำหรับการประชุมนี้คืออะไร?
richb

2
คำถามเกี่ยวกับ asp.net mvc ไม่ใช่หน้าเว็บ
fabspro

2

เท่าที่ฉันรู้ว่านี่เป็นเพียงการประชุมที่ใช้เพื่อระบุเจตนาของไฟล์ ฉันไม่เชื่อว่ามันจะเปลี่ยนพฤติกรรมของไฟล์ ในบริบทการพัฒนาส่วนใหญ่การเพิ่มขีดล่างเป็นการระบุสิ่งที่มีไว้สำหรับการใช้ "ส่วนตัว" ไม่ว่าจะโดยชั้นเรียนหรือในกรณีนี้คือแม่แบบอื่น


1

ฉันไม่ได้ใช้ MVC แต่ด้วยหน้าเว็บที่ใช้ไวยากรณ์ของมีดโกนคำนำหน้า _ โดยทั่วไปจะแสดงให้เห็นว่าหน้านั้นไม่ได้หมายถึงการเข้าถึงโดยผู้ใช้ แต่โดยหน้าอื่นหรือบางรหัส หากคุณพยายามนำทางไปยังหน้าที่มี _prefix, asp.net จะป้องกันการเข้าถึง นั่นคือเหตุผลที่มันใช้กับหน้าเลย์เอาต์และหน้าอื่น ๆ เนื่องจากไม่ควรเข้าถึงโดยผู้ใช้โดยตรง

บางอย่างเช่นโฟลเดอร์ App_Code ใน asp.net


@MikeBrind คุณไม่สามารถ 'นำทาง' ไปยัง / เรียกดูมุมมองใด ๆภายใต้/viewในโครงการ ASP.NET MVC เริ่มต้นโดยตรง /views/web.configไฟล์ถูกตั้งขึ้นเพื่อป้องกันไม่ให้มัน แต่ไม่มีอะไรที่จะป้องกันไม่ให้แอคชั่นควบคุมกลับมาView("_Index", model);ทำงานได้ดี ฉันเพิ่งทำได้โดยเปลี่ยนชื่อมุมมองเป็น _Index.cshtml และเปลี่ยนการกระทำที่จะเรียกเช่นเดียวกับที่ฉันทำข้างต้น
Andrew Barber เมื่อ

@MikeBrind คำถามนี้เกี่ยวกับ MVC ไม่ใช่เว็บเพจ จริงอยู่; ฉันไม่ได้ระบุไว้ในความคิดเห็นดั้งเดิมของฉัน
Andrew Barber

@MikeBrind ฉันเป็น - และน - การตอบสนองนี้คำตอบ ไม่ใช่ของคุณ. ความคิดเห็นเริ่มต้นของฉันทำให้เข้าใจผิด (ฉันยังพูดถึง "partials" แต่) ดังนั้นฉันได้ลบมัน ประเด็นของฉันคือและขีดเส้นใต้นั้นไม่เกี่ยวข้องกับการโหลดมุมมองใน MVC ผู้ใช้รายนี้เริ่มพูดว่า "ฉันไม่ได้ใช้ MVC" แต่คำถามนี้เกี่ยวกับ MVC ฉันแค่ทำให้แน่ใจว่ามีใครบางคนเข้ามาอ่านคำตอบนี้ในภายหลังไม่ได้คิดว่าใน MVC ขีดเส้นใต้จะส่งผลกระทบต่อความสามารถของตัวควบคุมในการโหลดมุมมอง ไม่ใช่เรื่องใหญ่. เราเห็นด้วยว่าฉันไม่เก่งในวิธีที่ฉันพูด เสร็จสิ้น
Andrew Barber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.