Tại sao Dao cạo _layout.cshtml có dấu gạch dưới hàng đầu trong tên tệp?


144

Trong dự án ASP.NET MVC 3 mặc định, các tệp cshtml bố cục & một phần bắt đầu bằng dấu gạch dưới

  • _viewstart
  • _Layout
  • _LogOnPartial

Tại sao lại quy ước này, và cái này dùng để làm gì? Tôi có cần tuân theo quy ước này không?

Liệu khung công tác có một số ý nghĩa đặc biệt đối với một .cshtmltệp bắt đầu bằng dấu gạch dưới?


Tôi sử dụng NancyFX với Dao cạo và theo mặc định, nó hạn chế mọi nội dung không có trong thư mục Nội dung. (Điều này có thể được ghi đè trong web.config hoặc cấu hình tùy chỉnh) không thể phục vụ bất kỳ tệp nào như .cshtml trực tiếp. Vì vậy, tôi không sử dụng "_" cho tên xem của mình vì nó KHÔNG cần thiết và xấu.
Norbert Norbertson

Câu trả lời:


205

Dao cạo được phát triển cho các trang web ASP.NET (WebMatrix), không có cùng loại bảo vệ được tích hợp trong các thư mục Lượt xem và Định tuyến mà bạn có trong MVC. Vì các trang bố cục trong Trang web không có ý định được phục vụ trực tiếp, nên chúng được thêm tiền tố vào dấu gạch dưới. Và khung trang Web đã được cấu hình để không cho phép các tệp có dấu gạch dưới hàng đầu trong tên của chúng được yêu cầu trực tiếp. Các tệp .cshtml khác trong Trang web thường cần có thể duyệt được. Chúng tương đương với các tệp .asp hoặc .php.

Nhóm ASP.NET đã tuyên bố rằng các trang Web là điểm khởi đầu trong quá trình phát triển ASP.NET, điều này sẽ dẫn đến việc di chuyển sang MVC kịp thời (đối với những người muốn tiếp tục). Một phần của điều đó có nghĩa là việc di chuyển từ Trang web sang MVC dễ dàng nhất có thể. Do đó, sẽ hợp lý hơn khi chuyển các quy ước đặt tên được thiết lập trong các trang Web sang các tệp MVC Razor.

Vì vậy, có một lý do kỹ thuật cho tiền tố tên tập tin với một dấu gạch dưới - nó chỉ là không liên quan đến MVC.

[CẬP NHẬT tháng 10 năm 2018]

Trong khung công tác ASP.NET Core Razor Pages (ngoài phiên bản 2.1), các tệp có dấu gạch dưới hàng đầu bị bỏ qua khi các tuyến đường được tạo khi khởi động - ngay cả khi chúng có một lệnh @page(thường sẽ biến chúng thành Trang dao cạo có thể định tuyến) . Đó là lý do tại sao nên đặt tên bố cục và một phần tệp có dấu gạch dưới hàng đầu trong ứng dụng Trang dao cạo nếu chúng không có ý định duyệt.


6
Cảm ơn. Đối với tôi đây là câu trả lời sâu sắc nhất. Tôi đã hiểu sai rằng Dao cạo được gắn với MVC. Bây giờ tôi thấy lý do cho dấu gạch dưới hàng đầu là để ngăn chúng được phục vụ trực tiếp dưới các trang web ASP.NET.
richb

1
Một quy ước đặt tên thực sự có chức năng gắn liền, tôi nghĩ MS sẽ biết rõ hơn. Và bây giờ, nó được chuyển sang MVC, được cho là một bản rõ ràng.
Boris B.

Hy vọng sau khi phát hành .NET Framework 4.5.1 và Visual Studio 2013 hiện tại bao gồm chức năng "One ASP.NET", cuối cùng họ cũng có thể tránh khỏi những hạn chế kỹ thuật / mã hóa cứng này. Tất nhiên việc có các tệp tiêu chuẩn không bao giờ được chia sẻ là điều cần thiết như với các thư mục * .config, APP_Code và APP_Data hiện tại. Nhưng logic này sẽ nằm trong một tệp cấu hình ở đâu đó (cấu hình máy làm mặc định) để có thể bị ghi đè. Ngoài ra, các tên mặc định của các trang phổ biến phải có thể định cấu hình (Bố cục / Lỗi / vv ...).
Tony Wall

1
@Daniel Ồ, tôi hiểu ý của bạn. Tôi đã chỉnh sửa câu trả lời vì nó không hoạt động như quảng cáo.
Mike Brind

1
@Daniel Những gì bạn đang thấy rõ ràng là một lỗi xuất hiện trong Trang dao cạo 2.1. Nó được lên kế hoạch để sửa trong 2.2. Nó hoạt động như tôi mô tả trong 2.0.
Mike Brind

12

Đó là cách Ruby on Rails thực hiện (Các phần bắt đầu bằng một _ nhưng lệnh gọi Phần kết xuất không bao gồm _) và ASP.net MVC đã lấy cảm hứng nặng nề từ nó.

Không có lý do kỹ thuật thực sự, chỉ là một quy ước để thể hiện rõ ý định cho các nhà phát triển khác (và bản thân bạn 6 tháng sau) để nói: Đây là một quan điểm một phần.


Điều này là không chính xác, như được chỉ ra bởi câu trả lời ở trên - gạch dưới có chức năng bảo mật.
iJungleBoy

1
@iJungleBoy Xem câu trả lời được chấp nhận. đối với ASP.net MVC (câu hỏi này là về vấn đề này), không có chức năng bảo mật. Xem web.config trong thư mục Lượt xem đã chặn tất cả các tệp cshtml và aspx, gạch dưới hoặc không (thiết lập System.Web.HttpNotFoundHandlercho chúng).
Michael Stum

7

Các trang không thể được hiển thị bởi các yêu cầu trực tiếp từ trình duyệt của bạn (trang chính, chế độ xem một phần, v.v.) có dấu gạch dưới (_) ở đầu tên của chúng.

Vì vậy, nếu bạn cố gắng thực hiện yêu cầu tới _Layout.cshtml (đây là trang chính), bạn sẽ gặp lỗi từ máy chủ.

Đó là một cách để phân biệt các tệp không thể được duyệt dưới dạng các trang độc lập, trong công cụ xem dao cạo.

Hãy nghĩ về nó theo cách này ... trong MVC 2 ... bạn sẽ phân biệt chế độ xem một phần và chủ nhân với sufix .master, .ascx và các trang bình thường là .aspx, mặt khác, trong chế độ xem Dao cạo ... tất cả các lượt xem là .cshtml, vì vậy để phân biệt một phần và các trang chính, chúng sẽ có tiền tố (_). không có gì bắt buộc, chỉ là một "quy ước".


4
Nhưng theo logic đó, TẤT CẢ các tệp cs & cshtml có tiền tố gạch dưới không?
richb

nếu tất cả các tệp sẽ có _ làm tiền tố thì trang web của bạn sẽ không hoạt động ... các tệp có _prefix được hiển thị bên trong một trang bình thường ... (đối với các phần) và sitemaster là một mẫu ... vì vậy nó phải có nội dung được hiển thị.
Juztin

Vì vậy, tôi đã thử điều này và IIS trên hộp của tôi không phục vụ bất kỳ tệp nào từ thư mục Lượt xem. Không phải tập tin .html tĩnh. Vì vậy, tôi thực sự không nghĩ rằng đây là câu trả lời.
richb

Juztin: Câu hỏi là tại sao họ bắt đầu với một dấu gạch dưới? Nếu tôi đổi tên _Layout.cshtm thành Layout.cshtml thì nó vẫn hoạt động tốt. Vậy lý do của quy ước này là gì?
richb

2
Câu hỏi là về asp.net mvc, không phải trang web
fabspro

2

Theo tôi biết đây chỉ đơn giản là một quy ước được sử dụng để xác định mục đích của tệp; Tôi không tin rằng nó thực sự sẽ thay đổi hành vi của tập tin. Trong hầu hết các bối cảnh phát triển, việc chuẩn bị một dấu gạch dưới xác định một cái gì đó có nghĩa là để sử dụng "riêng tư", cho dù bởi một lớp hoặc trong trường hợp này, một mẫu khác.


1

Tôi không sử dụng MVC, nhưng với các trang web cũng sử dụng cú pháp dao cạo, tiền tố _ thường cho thấy rằng trang không có nghĩa là người dùng truy cập mà bởi các trang khác hoặc một số mã. Nếu bạn cố điều hướng đến một trang có chứa _prefix, asp.net sẽ ngăn truy cập vào trang đó. Đó là lý do tại sao nó được sử dụng với các trang bố cục và các trang khác như vậy vì chúng không nên được truy cập trực tiếp bởi người dùng.

Một cái gì đó giống như thư mục App_Code trong asp.net


@MikeBrind Bạn không thể 'điều hướng' đến / duyệt trực tiếp bất kỳ chế độ xem nào /viewtrong dự án ASP.NET MVC mặc định; các /views/web.configtập tin được thiết lập để ngăn chặn nó. Nhưng không có để ngăn hành động điều khiển quay trở lại View("_Index", model);Nó hoạt động tốt; Tôi đã làm điều đó bằng cách thay đổi tên của chế độ xem thành _Index.cshtml và thay đổi hành động để gọi như tôi đã làm ở trên.
Andrew Barber

@MikeBrind Câu hỏi này là về MVC, không phải trang Web. Được cấp; Tôi đã không xác định rằng trong nhận xét ban đầu của tôi.
Andrew Barber

@MikeBrind Tôi đã - và đang - trả lời câu trả lời này . Không phải của bạn. Nhận xét ban đầu của tôi là sai lệch (mặc dù tôi cũng đã đề cập đến "partials"), vì vậy tôi đã xóa nó. Quan điểm của tôi là và phần dưới không liên quan gì đến việc không thể tải một khung nhìn trong MVC. Người dùng này thậm chí đã bắt đầu nói, "Tôi không sử dụng MVC", nhưng câu hỏi này là về MVC. Tôi chỉ đảm bảo một người nào đó đến cùng sau đọc này câu trả lời không bằng cách nào đó nghĩ rằng trong MVC, một dấu gạch dưới ảnh hưởng đến khả năng của một hành động điều khiển để tải một cái nhìn. Không sao đâu. Chúng tôi đồng ý tôi đã vô tư trong cách tôi nói. Làm xong.
Andrew Barber
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.