2010-08-24 16 views
24

tôi muốn chỉ định (ở một nơi) một trang bố trí mặc định trong Razor, vì vậy mà tôi có thể xóa này:Làm thế nào để xác định LayoutPage mặc định trong Razor trong ASP.NET MVC 3 Preview 1?

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

từ mỗi tập tin .cshtml tôi có. Nhưng tôi không biết làm thế nào ... Bất cứ ý tưởng? Tôi đang sử dụng công cụ Razor từ ASP.NET MVC 3 Preview 1.

+0

Câu trả lời thứ hai ở đây nên được đánh dấu là câu trả lời được chấp nhận vì lợi ích của phần còn lại của cộng đồng, xin vui lòng. – Brondahl

Trả lời

0

Không có cách nào dễ dàng để thực hiện việc này trong Bản xem trước MVC 3 1. Đây là giới hạn của các bit xem trước sẽ được giải quyết trong các bản phát hành sắp tới. Rất tiếc, các tệp _init.cshtml không hoạt động trong bản xem trước này của MVC3 nên bạn không thể theo mẫu trang Web.

Có 2 cách tôi có thể nghĩ ra để làm cho nó làm việc (mặc dù không phải là tối ưu)

  1. viết lớp cơ sở trang của riêng bạn mà xuất phát từ WebViewPage và thiết lập Layout ngay trong các nhà xây dựng ... nhưng trong trường hợp đó, bạn sẽ phải chỉ định một chỉ thị @inherits trong mọi chế độ xem.
  2. đặt ghi đè bố cục trong phương thức hành động của bạn (sử dụng ghi đè View(string viewName, string masterName)). Bạn có thể viết một lớp cơ sở điều khiển trung gian mà sẽ có một phương pháp trợ giúp để tiết kiệm cho mình những rắc rối của việc lặp lại bố trí ở khắp mọi nơi.
+3

Vì lợi ích của phần còn lại của cộng đồng: lưu ý rằng câu trả lời thứ hai được coi là tốt hơn. – Brondahl

2

Dường như cách để làm điều này là sử dụng tệp _init.cshtml trong thư mục gốc của thư mục xem mà bạn muốn có một trang chung phần tử (tiêu đề). Khi công cụ xem dao cạo xây dựng trang của bạn, nó sẽ tìm một vài tệp cụ thể được gọi là _start.cshtml, _init.cshtml và _end.cshtml; các tệp này được tải theo thứ tự tương ứng theo công cụ xem cho mọi yêu cầu. Đặt định nghĩa LayoutPage và/hoặc các hoạt động khởi tạo phổ biến khác trong các tệp này sẽ đảm bảo chúng chạy cho tất cả các trang.

Lưu ý: Tôi không chắc liệu hiệu ứng đó có được chuyển vào các thư mục con không vì nó không rõ ràng từ tài liệu; bạn sẽ phải thử và tìm hiểu.

Có thông tin chi tiết hơn một chút về cách thực hiện việc này trong cuốn sách hướng dẫn của Microsoft về xây dựng trang bằng Razor. Tôi đã tìm thấy đoạn mã Chạy trước và sau tệp trong thư mục trên trang 169. Kiểm tra Microsoft download page cho sách đầy đủ cũng như các mẫu dao cạo bổ sung.

+0

Có, tôi đã nghe nói về nó. Và nó không hoạt động bất kể tôi đặt _init.cshtml ở đâu ... Làm thế nào? BTW Cảm ơn bạn rất nhiều vì đã liên kết, nó chắc chắn sẽ giúp tôi trong tương lai! – Darmak

+0

Nhìn vào cuốn sách một lần nữa tôi thấy nó nói để đặt _init.cshtml, _start.cshtml và _end.cshtml trong thư mục gốc của trang web của bạn. Giống như Global.asax. –

+1

'_init.cshtml' không làm việc trong MVC 3 Preview 1 vì vậy bạn không thể làm theo mẫu đó. Tuy nhiên, điều này sẽ được hỗ trợ trong các bản phát hành trong tương lai. – marcind

68

Tạo một "~/Views/_ViewStart.cshtml" và trang sau bên trong:

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

Lưu ý rằng bạn có thể viết mã ở đây, vì vậy nó có thể thay đổi cách bố trí của bạn dựa trên loại thiết bị được nhắm mục tiêu, v.v.

Điều này hiện được tạo theo mặc định trong một dự án MVC3 trống.

Source

+0

Cũng tìm thấy bài đăng hữu ích này minh họa việc nhắm mục tiêu các thiết bị khác nhau với phương pháp này: http://www.michaelfcollins3.me/2011/01/changing-your-razor-view-layout-for-themes-and-devices/ – miguelv

+1

Điều này nên là câu trả lời được chấp nhận. Nó cũng hoạt động trong MVC 4. – JConstantine

+1

Không chắc chắn những gì đã xảy ra, nhưng vì lý do nào đó trình duyệt của tôi đã quyết định đưa ra một downvote về câu trả lời này. Trong khi đó không có gì là sai với nó. Tôi đã không nhận thấy điều này cho đến bây giờ vì vậy tôi không thể thay đổi nó nữa, xin lỗi của tôi! –