Cách chính xác để sử dụng _viewstart.cshtml và một phần Chế độ xem dao cạo?


156

Tôi đang sử dụng _viewstart.cshtml để tự động gán Bố cục dao cạo tương tự cho chế độ xem của tôi.

Đó là một tệp đơn giản đã chết trong thư mục gốc của thư mục Lượt xem của tôi trông như thế này:

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

Đây là DRY nhiều hơn so với việc thêm chỉ thị @Layout vào mỗi chế độ xem.

Tuy nhiên, điều này đặt ra một vấn đề đối với các chế độ xem một phần của Dao cạo , vì chúng chạy nội dung của _viewstart.cshtml và do đó tự gán cho mình một bố cục không chính xác, khiến chúng, ừm, không còn là một phần.

Đây là một dự án giả định, hiển thị tệp _viewstart.cshtml, tệp _layout.shtml được chia sẻ và chế độ xem một phần ("AnonBar.cshtml").

Cấu trúc dự án ví dụ

Hiện tại, cách mà tôi đang khắc phục điều này là bằng cách thêm dòng sau vào mỗi chế độ xem một phần:

@{
    Layout = "";
}

Điều này có vẻ như là cách sai để biểu thị một quan điểm là một phần trong Dao cạo. (Lưu ý rằng không giống như công cụ xem biểu mẫu web, phần mở rộng tệp giống nhau cho chế độ xem một phần.)

Các lựa chọn khác tôi đã xem xét nhưng điều đó thậm chí còn tồi tệ hơn:

  • Đặt tất cả các chế độ xem một phần vào một thư mục chung, để chúng có thể chia sẻ một _viewstart.cshtml chung. Điều này phá vỡ quy ước về các khung nhìn nằm trong cùng thư mục với bộ điều khiển của chúng.
  • Không sử dụng một phần quan điểm.

Đây có phải là thứ vẫn đang được nhóm công cụ của chế độ xem Dao cạo, hoặc tôi đang thiếu một khái niệm cơ bản?


3
Xin lỗi vì ngoại lệ, nhưng những biểu tượng bên cạnh tên tệp là gì? :) Một số loại kiểm soát nguồn phải không?
Alex

6
@jitbit: VisualSVN
erict

Câu trả lời:


237

Nếu bạn return PartialView()từ bộ điều khiển của bạn (thay vì return View()), thì _viewstart.cshtmlsẽ không được thực thi.


6
Aha, không biết gì về PartialViewResultlớp học. Đó là những gì tôi cần.
Portman

6
Là một theo dõi, tôi đã phát hiện ra rằng tôi cần phải cũng thiết lập một cách rõ ràng kiểu trả về của phương thức hành động để PartialViewResultthay vì thông thường ActionResult.
Portman

2
@Portman bạn có thấy vấn đề khi kiểu trả về của phương thức hành động không ActionResult? Tôi ngạc nhiên rằng đây là một vấn đề vì thời gian chạy MVC không nên hành xử khác đi trong trường hợp này (tức là kiểu được trả về bởi phương thức hành động ActionResulthoặc bất kỳ lớp nào xuất phát từ nó mọi thứ sẽ hoạt động).
marcind

@marcind Tôi nhận được một Stack Overflow trên w3wp.exe nếu tôi đặt loại trả về thành ActionResult. Hoạt động tốt nếu loại trở lại là PartialViewResult. Nghĩ rằng tôi cần phải báo lỗi Connect?
Portman

Nghe có vẻ giống tôi - hãy hét lại nếu bạn gửi lỗi Connect, sẽ bỏ phiếu.
Dav
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.