2012-02-15 31 views
168

Đây là About.cshtml từ mặc định MVC 3 mẫu:Tệp liên kết _ViewStart.cshtml ở đâu và như thế nào được liên kết?

@{ 
    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 tin _ViewStart sẽ được tìm thấy trong About.cshtml, nhưng rõ ràng nó không phải.

Tôi đã xem global.asaxweb.config, nhưng tôi không thể tìm hiểu cách tệp About.cshtml đượ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 xảy ra dưới mui xe ...

Trả lời

197

Từ ScottGu's blog:

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

file _ViewStart có thể được sử dụng để xác định xem mã phổ biến mà bạn w kiến để thực thi khi bắt đầu hiển thị của mỗi Chế độ xem. Ví dụ, chúng ta có thể viết mã trong tập tin _ViewStart.cshtml của chúng tôi để lập trình thiết lập thuộc tính cho mỗi Layout Xem được file SiteLayout.cshtml theo mặc định:

Bởi vì mã này thực hiện vào lúc bắt đầu của mỗi View, chúng tôi không còn cần phải đặt rõ ràng Bố cục 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 chọn làm cho logic lựa chọn Bố cục của chúng tôi phong phú hơn chỉ là bộ 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ị đang truy cập trang web - và bố cục điện thoại hoặc máy tính bảng được tối ưu hóa cho các thiết bị đó và bố cục được tối ưu hóa cho máy tính/Máy tính để bàn . Hoặc nếu chúng tôi đang xây dựng hệ thống CMS hoặc ứng dụng dùng chung được sử dụng trên 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 nhiều giao diện người dùng linh hoạt. Nó cũng cho phép bạn nhiều hơn dễ dàng viết logic xem một lần và tránh lặp lại nó trong nhiều địa điểm .

Xem thêm this.

+12

Vì vậy, nó ít nhiều là một tính năng "hardcoded" của MVC3? Tôi không cần phải thay đổi nó sang 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ả ra :) – Kman

+1

Kman- Hardcoded, theo quy ước (chọn một 'xử lý' ở đây :)) - vì vậy có, chính xác. vui mừng nó xóa sương mù –

+0

Nó không chỉ trong thư mục "Views" của bạn mà bạn có thể cần nó. Nếu bạn thêm một RazorViewEngine tùy chỉnh để tổ chức các khung nhìn vào các thư mục khác, bạn phải đưa tệp vào thư mục gốc của các thư mục xem thay thế đó. Ví dụ, tôi đã di chuyển tất cả các khung nhìn mẫu Inspinia vào một thư mục và chạy nó trong công cụ xem 'ViewLocationFormats = ViewLocationFormats.Union (chuỗi mới [] {" ~/Inspinia/ExampleViews/{1}/{0} .cshtml "}) .ToArray(); '. Kết quả là, tôi phải thêm một bản sao của tệp _ViewStart.cshtml 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

17

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

Nếu bạn muốn có tập tin riêng cshtml của bạn như là một khuôn mẫu thông thường, bạn có thể làm theo cách này

Trong bạn _viewstart.cshtml bạn có thể đề cập đến chung cshtml tập tin của bạn.

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

Theo nghĩa chung, khả năng này của khung MVC "biết" về _Viewstart.cshtml được gọi "Coding by convention".

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

Wikipedia

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

+7

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

+0

Không vi phạm quy ước là loại điểm. AKAIK Ruby on Rails cũng theo mô hình này. –

+0

+1 Raif. Không có điểm trong việc bảo vệ tài liệu kém "mã hóa theo quy ước". Tôi có thể nói về bất kỳ mã ngược nào của tôi. "Cái gì? Bạn đã không mong đợi nó sụp đổ khi nó đế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 nội bộ nguồn. – shannon

10

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

Tham chiếu MVC 6 code từ Github, chúng tôi có một vài tác phẩm quan tâm

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

Do những thay đổi cơ cấu nguồn, thông tin này có thể được tìm thấy trong RazorViewEngine.cs nhìn cho "GetViewStartPages" chức năng.

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

ViewStartProvider, đó là trách nhiệm tập hợp một danh sách các file _ViewStart, có chức năng GetViewStartPages. Chức năng này phụ thuộc vào ViewStartHierarchyUtility để thực hiện công việc nhận danh sách tệp khởi tạo. Điều này trả lời cách các tập tin viewstart được thu thập.

Để trả lời cách chúng phát huy, hãy xem RazorView, Tôi tin (vì IView) được gắn với đường ống 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 cuộc gọi tới RenderPage VÀ THEN RenderLayout (LƯU Ý ĐƠN HÀNG). RenderPage trước tiên thực hiện các cuộc gọi để xử lý các tệp xem trước (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 RazorView.cs tệp dưới không gian tên Microsoft.AspNet.Mvc.Razor.

3

Đ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).

Động cơ Razor tìm và chạy mã trong _ViewStart.cshtml trước khi bất kỳ mã khác đó là trong cùng thư mục hoặc thư mục con nơi _ViewStart.cshtml được 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ó.

+1

đây là những gì tôi đang tìm kiếm, tôi ghét "không biết" những gì đang xảy ra trong dự án của tôi, bởi vì tôi cũng đang làm mẫu của riêng mình cho VS và tệp này vừa phát ra từ không khí rất khó hiểu –

0

Nếu bạn muốn có bố cục chung cho trang của mình, bạn cần phải 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 và mọi chế độ xem, điều này vi phạm DRY (Không lặp lại) Chính mình) nguyên tắc. Đối với điều này. Net Framework đã cung cấp tệp "_ViewStart.cshtml", được đặt bên trong thư mục 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 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ử cho chế độ xem Trang chủ của bạn, bạn có thể tạo "_ViewStart.cshtml" mới có tham chiếu đến bố cục đó và đặt nó trong thư mục "Chế độ xem nhà".

Các vấn đề liên quan