Tệp bố cục _ViewStart.cshtml được liên kết ở đâu và như thế nào?


199

Đây là About.cshtml từ mẫu MVC 3 mặc định:

@{
    ViewBag.Title = "About Us";
}

<h2>About</h2>
<p>
     Put content here.
</p>

Tôi hy vọng rằng một tham chiếu đến tệp _ViewStart sẽ được tìm thấy trong About.cshtml, nhưng rõ ràng là không.

Tôi đã xem global.asaxweb.config, nhưng tôi không thể tìm ra cách About.cshtmltệp được "liên kết" với bố cục từ tệp _ViewStart.

Mọi thứ hoạt động như mong đợi, tôi chỉ muốn biết những gì đang diễn ra dưới mui xe ...

Câu trả lời:


237

Từ blog của ScottGu :

Bắt đầu với bản phát hành ASP.NET MVC 3 Beta, giờ đây bạn có thể thêm một tệp có tên _ViewStart.cshtml (hoặc _ViewStart.vbhtml cho VB) bên dưới thư mục \ Views của dự án của bạn:

Tệp _ViewStart có thể được sử dụng để xác định mã chế độ xem phổ biến mà bạn muốn thực thi khi bắt đầu kết xuất của mỗi Chế độ xem. Ví dụ: chúng tôi có thể viết mã trong tệp _ViewStart.cshtml của mình để đặt thuộc tính Bố cục cho mỗi Chế độ xem thành tệp SiteLayout.cshtml theo mặc định:

Vì mã này thực thi khi bắt đầu mỗi Chế độ xem, chúng tôi không còn cần phải đặt Bố cục một cách rõ ràng trong bất kỳ tệp xem riêng lẻ nào của chúng tôi (trừ khi chúng tôi muốn ghi đè giá trị mặc định ở trên).

Quan trọng: Vì _ViewStart.cshtml cho phép chúng tôi viết mã, chúng tôi có thể tùy ý làm cho logic lựa chọn Bố cục của chúng tôi phong phú hơn chỉ là một tập thuộc tính cơ bản. Ví dụ: chúng tôi có thể thay đổi mẫu Bố cục mà chúng tôi sử dụng tùy thuộc vào loại thiết bị nào đang truy cập trang web - và có bố cục được tối ưu hóa cho điện thoại hoặc máy tính bảng cho các thiết bị đó và bố cục được tối ưu hóa cho máy tính để bàn cho PC / Máy tính xách tay. Hoặc nếu chúng tôi đang xây dựng một hệ thống CMS hoặc ứng dụng chia sẻ chung được sử dụng cho nhiều khách hàng, chúng tôi có thể chọn các bố cục khác nhau để sử dụng tùy thuộc vào khách hàng (hoặc vai trò của họ) khi truy cập trang web.

Điều này cho phép rất nhiều tính linh hoạt của giao diện người dùng. Nó cũng cho phép bạn dễ dàng viết logic xem một lần và tránh lặp lại nó ở nhiều nơi.

Cũng thấy điều này .


14
Vì vậy, nó ít nhiều là một tính năng "mã hóa cứng" của MVC3? Tôi không có nhu cầu thay đổi nó thành một trang "mặc định" khác, chỉ tò mò về cách nó được thiết lập. Cảm ơn bạn đã sắp xếp tất cả :)
Kman

2
Kman- Hardcoding, theo quy ước (chọn một 'xử lý' khác ở đây :)) - vì vậy, chính xác. rất vui vì nó đã xóa sương mù
jim BOTan

Nó không chỉ trong thư mục "Lượt xem" mà bạn có thể cần nó. Nếu bạn thêm một Dao cạo tùy chỉnh để sắp xếp các khung nhìn vào các thư mục khác, bạn cũng phải bao gồm tệp trong thư mục gốc của các thư mục xem thay thế đó. Ví dụ: tôi đã chuyển tất cả các chế độ xem mẫu Inspinia vào một thư mục và chạy nó trong công cụ xem ViewLocationFormats = ViewLocationFormats.Union(new string[] { "~/Inspinia/ExampleViews/{1}/{0}.cshtml" }).ToArray();. Do đó, tôi đã phải thêm một bản sao của tệp _ViewStart.cshtml của mình vào "~ / Inspinia / exampleViews", nếu không nó đã không được chọn và không có bố cục nào được đặt.
Triynko

2
Nếu thư mục Lượt xem của bạn có các thư mục con, bạn có thể đặt một _ViewStartthư mục con vào mỗi thư mục con sẽ liên kết đến các khung nhìn trong thư mục con đó không?
chập chững

35

Nói một cách khái quát hơn, khả năng này của khung MVC để "biết" về _Viewstart.cshtml được gọi là "Mã hóa theo quy ước".

Quy ước về cấu hình (còn được gọi là mã hóa theo quy ước) là một mô hình thiết kế phần mềm nhằm tìm cách giảm số lượng quyết định mà các nhà phát triển cần đưa ra, đạt được sự đơn giản, nhưng không nhất thiết là mất tính linh hoạt. Cụm từ về cơ bản có nghĩa là một nhà phát triển chỉ cần xác định các khía cạnh độc đáo của ứng dụng. Ví dụ: nếu có Bán lớp trong mô hình, bảng tương ứng trong cơ sở dữ liệu được gọi là doanh số bán hàng theo mặc định. Chỉ khi một người đi chệch khỏi quy ước này, chẳng hạn như gọi bảng sản phẩm, các sản phẩm, thì người ta cần phải viết mã liên quan đến các tên này.

Wikipedia

Không có phép thuật đối với nó. Nó chỉ được viết vào cơ sở mã lõi của khung công tác MVC và do đó là thứ mà MVC "biết". Đó là lý do tại sao bạn không tìm thấy nó trong các tệp .config hoặc ở nơi khác; Nó thực sự nằm trong mã MVC. Tuy nhiên, bạn có thể ghi đè để thay đổi hoặc loại bỏ các quy ước này.


13
Nếu MVC biết về nó, thì tại sao Visual Studio không biết và chỉ ra điều này cho tôi? Nếu mã hóa theo quy ước có nghĩa là mọi thứ hoạt động miễn là bạn không phá vỡ quy ước thì nó thật tệ ...
Arne Evertsson

Không phá vỡ quy ước là loại điểm. AKAIK Ruby on Rails cũng tuân theo mô hình này.
Umar Farooq Khawaja

+1 Raif. Không có điểm nào trong việc bảo vệ tài liệu kém "mã hóa theo quy ước". Tôi có thể nói rằng về bất kỳ mã ngược nào của tôi. "Cái gì? Bạn không ngờ nó bị sập khi lên 33? Mọi người đều biết bạn bỏ qua 33." Thật không may, khoảng cách tài liệu cho ASP.NET MVC là rất lớn. Các tài liệu MS duy nhất được tạo tự động mà không có tóm tắt nguồn nội bộ.
shannon

6
Quy ước về cấu hình không có nghĩa là bạn không thể thay đổi nó. Ở đó NÊN cấu hình có sẵn để có thể chỉ định tên và vị trí của tệp đó. Có thể rất tốt, nhưng ai biết nó là gì. Mọi người sử dụng câu thần chú "quy ước về cấu hình" để đưa ra vô số quyết định tồi tệ trong một cơ sở mã hóa và điều đó làm tôi bực mình khi anh chàng đi theo sau thực tế để duy trì mớ hỗn độn tài liệu kém của họ rằng "chỉ hoạt động" (nhưng Chúa cấm bạn thay đổi bất cứ điều gì - bạn sẽ dành hàng giờ để tìm ra cách bạn phá vỡ mọi thứ).
Robert C. Barth

3
@AidenStrydom Tôi không đồng ý. Câu trả lời được chấp nhận thực sự cho tôi biết cách sử dụng _ViewStart. Câu trả lời này chỉ nói về một khái niệm thiết kế. Tôi đến đây để biết thông tin về _ViewStart, không phải thông tin về lý do tại sao Visual Studio sẽ không cho tôi biết bất cứ điều gì về _ViewStart.
Millie Smith

23

Chỉ là một suy nghĩ khác.

Nếu bạn muốn có cshtmltệp riêng của mình làm mẫu chung, bạn có thể thực hiện theo cách này

Trong phạm vi của _viewstart.cshtmlbạn, bạn có thể đề cập đến cshtmltập tin phổ biến của bạn .

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

14

Mã nguồn là một nơi tốt hơn để tìm kiếm điều này hơn là tài liệu.

Tham khảo mã MVC 6 từ Github, chúng tôi có một vài tệp quan tâm

---- cập nhật ----

Do thay đổi cấu trúc nguồn, thông tin về cách thu thập các trang viewstart hiện có thể được tìm thấy trong RazorViewEngine.cs tìm kiếm chức năng "GetViewStartPages".

---- / cập nhật ----

Để trả lời cách chúng hoạt động, hãy xem RazorView , cái mà tôi tin (vì IView) được gắn với đường ống dẫn MVC. Tệp này có phương thức RenderAsync được gọi từ đường dẫn MVC để hiển thị chế độ xem được yêu cầu.

RenderAsync thực hiện các cuộc gọi đến RenderPage VÀ THEN RenderLayout (LƯU Ý ĐẶT HÀNG). Trước tiên, RenderPage thực hiện các cuộc gọi để xử lý các tệp viewstart (lưu ý số nhiều, có thể có nhiều hơn một tệp _viewstart).

Vì vậy, thông tin bạn tìm kiếm có thể được lấy từ hàm RenderViewStartAsync trong tệp RazorView.cs trong không gian tên Microsoft.AspNet.Mvc.Razor.


7

Điều này có thể thêm một số thông tin bổ sung cho câu hỏi này ngay bây giờ (2016 ala MVC4, MVC5).

Công cụ dao cạo tìm và chạy mã trong _ViewStart.cshtml trước bất kỳ mã nào khác trong cùng thư mục hoặc thư mục con nơi _ViewStart.cshtml tìm thấy .

Bất kỳ chế độ xem nào cũng có thể ghi đè thuộc tính Bố cục hoặc bất kỳ giá trị nào của nó.

Chỉ cần nghĩ rằng tôi có thể thêm một chút thông tin để cho bạn thấy lý do tại sao đó là _ViewStart.

Nếu bạn nhận được ILSpy và kiểm tra mã trong RazorViewEngine (System.Web.Mvc.dll), bạn sẽ thấy chính mã đó tham chiếu tên đó.

_ViewStart trong System.Web.Mvc.dll

Bạn có thể thấy rằng RazorViewEngine tìm kiếm một tệp có tên đó:

mã dao cạo

RazorViewEngine.ViewStartFileName = "_ViewStart";

3
Đây là những gì tôi đang tìm kiếm, tôi ghét "không biết" những gì đang diễn ra trong dự án của mình, vì tôi cũng đang thực hiện các mẫu riêng của mình cho VS và tệp này được phát hành từ trên không rất khó hiểu
Sebastian 506563

1

Nếu bạn muốn có bố cục chung cho các trang của mình, bạn cần xác định bố cục chung và để liên kết chế độ xem với bố cục, chúng tôi phải đặt thuộc tính bố cục trên mỗi chế độ xem, điều này vi phạm nguyên tắc DRY (Không lặp lại chính mình). Đối với .Net Framework này đã cung cấp tệp "_ViewStart.cshtml", được đặt bên trong thư mục dạng xem. Chúng tôi đặt thông tin bố cục trong tệp "_ViewStart.cshtml" và mọi chế độ xem theo mặc định đều sử dụng thông tin bố cục này. Nếu bạn muốn cung cấp một số thông tin bố cục khác nhau, giả sử với chế độ xem Trang chủ của bạn, bạn có thể tạo một "_ViewStart.cshtml" mới với tham chiếu đến bố cục đó và đặt nó vào thư mục "Chế độ xem tại nhà".


1

Câu trả lời ngắn gọn là : ViewStarts bắt đầu trước khi bất kỳ chế độ xem nào được hiển thị. Câu chuyện dài dưới đây:

Câu chuyện về việc tạo ra một tập tin xem duy nhất:

  1. ViewStart được hợp nhất với ViewImports và sau đó được thực thi dưới dạng một tệp. Lưu ý rằng ViewImports luôn được hợp nhất với bất kỳ tệp cshtml nào, kể cả tệp ViewStart. Mục đích của nó là để tóm tắt các câu lệnh @USE và các chỉ thị phổ biến khác.
  2. Đầu ra của ViewStart (như Bố cục và ViewData) sẽ có sẵn cho tệp View cụ thể.
  3. Bên trong tệp View, nếu biến Bố cục là / trở thành null, phần thân của khung nhìn được hiển thị và đầu ra cuối cùng được gửi đến người dùng.
  4. Nếu biến Bố cục là / trở thành không rỗng, thì việc thực thi được chuyển sang tệp bố cục, lần lượt được hợp nhất với ViewImports dưới dạng một tệp và sau đó tại câu lệnh @RenderBody () bên trong thực thi tệp bố cục được chuyển trở lại tệp xem được kết hợp lại với ViewImports và đầu ra được hợp nhất với tệp bố cục tại vị trí của @RenderBody () và đầu ra cuối cùng cuối cùng được gửi đến người dùng.

Hy vọng điều này làm cho bạn biết về những gì thực sự xảy ra bên trong những bí ẩn chưa biết trong vòng đời của chương trình của bạn.

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.