Buộc tất cả các Khu vực sử dụng cùng một Bố cục


88

Tôi có cấu trúc dự án sau:

  • / Lượt xem / Đã chia sẻ / _Layout;

  • / Khu vực / Khu vực1 / Lượt xem / Tên bộ điều khiển / Chỉ mục;

...

  • / Khu vực / Khu vựcN / Lượt xem / Tên bộ điều khiển / Chỉ mục.

Có cách nào để buộc tất cả các khu vực sử dụng _Layout làm bố cục cơ sở không?

Có cách nào để làm điều đó mà không cần thêm tệp _ViewStart (ví dụ: thông qua cấu hình định tuyến) không?

Xem thêm:

Làm cách nào để chỉ định các Bố cục khác nhau trong tệp ViewStart dao cạo ASP.NET MVC 3?


Câu trả lời:


155

Bạn chỉ cần thêm một tệp có tên:

_ViewStart.cshtml

Trong mỗi thư mục chế độ xem khu vực:

/Areas/Area1/Views/_ViewStart.cshtml

Và chỉnh sửa tệp để trỏ đến bố cục gốc như sau:

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

Để điều này hoạt động, bạn không phải chỉ định giá trị trong thuộc tính bố cục của chế độ xem, nếu bạn làm như vậy, bạn sẽ ghi đè bố cục chung

Lưu ý: Như Tony đã đề cập, bạn có thể chỉnh sửa thuộc tính bố cục của mỗi chế độ xem để trỏ đến bố cục gốc, tuy nhiên đây không phải là cách được khuyến nghị để thực hiện vì bạn sẽ ghép các chế độ xem với bố cục của mình và thay đổi nó sẽ rất khó khăn

Chỉnh sửa 1

Nếu bạn muốn sử dụng mã để đặt bố cục của chế độ xem mặc định, có lẽ bạn nên xem xét việc viết một công cụ chế độ xem tùy chỉnh.

Hãy thử google về tùy chỉnh RazorViewEngineRazorView

Bài viết này có thể là một điểm khởi đầu tốt

http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx

Tôi chưa làm điều gì đó như thế này nhưng tôi hy vọng tôi sẽ chỉ cho bạn đúng hướng


1
Có cách nào để làm điều đó mà không cần thêm tệp "_ViewStart" (ví dụ: thông qua cấu hình định tuyến) không?
Mikhail

2
Trong định tuyến, tôi không nghĩ vậy. Họ là hai việc khác nhau. Định tuyến chịu trách nhiệm tìm cách đối sánh URL yêu cầu hiện tại với một tuyến đường đã đăng ký trong RoutesTable, khi tìm thấy khớp, IMvcRouteHandler sẽ được tạo và sau đó IHttpHandler (MvcHandler) phụ trách xử lý hành động của bộ điều khiển của bạn. Như bạn có thể thấy, điều này không liên quan gì đến chế độ xem cũng như bố cục. Điều này là do một tuyến không cần thiết trả về một dạng xem, nó có thể trả về json hoặc xml. Vì vậy, định tuyến không phải là nơi chính xác để thực hiện một cái gì đó như thế này.
Jupaol

Bạn cũng có thể thêm _ViewStarttrực tiếp vào thư mục Khu vực để áp dụng nó cho tất cả các khu vực.
Artur

21

Mở rộng câu trả lời của Jupaol ....

Ít nhất trong VS2013, tệp _ViewStart.cshtml được thêm theo mặc định khi tạo khu vực, vì vậy nó đã ở đó và bạn có thể thay đổi nội dung khi anh ta ghi chú để trỏ đến _Layout.cshtml gốc. Sau đó, bạn có thể xóa _Layout.cshtml trong khu vực, vì nó không còn được sử dụng nữa (và hiện tại có thể là một nguồn gây nhầm lẫn)

Tuy nhiên, bằng cách thực hiện bất kỳ định tuyến nào được thực hiện trong _Layout.cshtml gốc đó sẽ cần phải xem xét các khu vực.
_Layout.cshtml mặc định có một số trình trợ giúp ActionLink cần sửa đổi một chút:

Thêm thông số RouteValueDictionary vào bất kỳ lệnh gọi ActionLink nào bằng cách đặt Area = "". Lưu ý rằng chuỗi rỗng đề cập đến cấp gốc. Điều này sẽ cho phép các liên kết này hoạt động chính xác khi được gọi từ bên trong một khu vực, vẫn hoạt động khi được gọi từ gốc.

ví dụ:

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>

2

Bạn chỉ định bố cục bằng cách sử dụng:

@ {Bố cục = "_Layout"; }

Nếu bạn muốn làm cho việc này dễ dàng hơn, hãy thay đổi tất cả cùng một lúc. Có lẽ bạn chỉ có thể đặt nó làm biến view bag và chuyển nó vào bộ điều khiển. Để làm cho nó dễ dàng hơn, bạn có thể tạo một bộ điều khiển cơ sở mà các bộ điều khiển khác kế thừa từ đó và chỉ định bố cục cho túi xem ở đó.

Không chắc tại sao định tuyến lại cần thay đổi hoặc có lẽ tôi không hiểu. Hi vọng điêu nay co ich :)

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.