ASP.NET MVC: Mục đích của @section là gì? [đóng cửa]


132

Đối với một ứng dụng ASP.NET MVC, tôi thấy bài viết blog này . Tác giả ScottGu thêm @sectionvào Index.cshtml.

Tôi có một vài câu hỏi (tham khảo bài viết trên):

  • Index.cshtml có phải là Chế độ xem được chia sẻ không?
  • Mã ví dụ sử dụng @sectionmã trong một khung nhìn cụ thể. Tại sao?

Ai đó có thể giải thích tại sao và khi nào tôi sẽ sử dụng @sectiontrong Chế độ xem không?



1
Mặc dù có thể lập luận rằng một lý do đóng cửa tốt hơn ngày hôm nay sẽ là "chủ yếu dựa trên quan điểm", nhưng nó vẫn sẽ bị đóng cửa. Không có cách dứt khoát để sử dụng các phần.
Richard

2
Không có cách dứt khoát để sử dụng bất cứ điều gì. Chỉ cần nhìn vào cách mọi người sử dụng internet ...
keji 17/12/18

Câu trả lời:


138

@sectionlà để xác định nội dung được ghi đè từ chế độ xem được chia sẻ. Về cơ bản, đó là một cách để bạn điều chỉnh chế độ xem được chia sẻ của mình (tương tự như Trang chính trong Biểu mẫu web).

Bạn có thể thấy Scott Gu viết về điều này rất thú vị .

Chỉnh sửa: Dựa trên làm rõ câu hỏi bổ sung

Các @RenderSectioncú pháp đi vào Xem chia sẻ, chẳng hạn như:

<div id="sidebar">
    @RenderSection("Sidebar", required: false)
</div>

Điều này sau đó sẽ được đặt trong chế độ xem của bạn với @Sectioncú pháp:

@section Sidebar{
    <!-- Content Here -->
}

Trong MVC3 +, bạn có thể xác định tệp Bố cục sẽ được sử dụng trực tiếp cho chế độ xem hoặc bạn có thể có chế độ xem mặc định cho tất cả các chế độ xem.

Các cài đặt chế độ xem thông thường có thể được đặt trong _ViewStart.cshtml, định nghĩa chế độ xem bố cục mặc định tương tự như sau:

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

Bạn cũng có thể đặt Chế độ xem được chia sẻ để sử dụng trực tiếp trong tệp, chẳng hạn như index.cshtml trực tiếp như được hiển thị trong đoạn trích này.

@{
    ViewBag.Title = "Corporate Homepage";
    ViewBag.BodyID = "page-home";
    Layout = "~/Views/Shared/_Layout2.cshtml";
}

Có nhiều cách bạn có thể điều chỉnh cài đặt này với một vài đề cập khác trong câu trả lời SO này .


Cảm ơn Frazell! Tôi đã thêm nhiều hơn vào câu hỏi của tôi để tham khảo hướng dẫn đó. Bạn có thể giải thích thêm? Cảm ơn một lần nữa!
Một

Này @ABogus Tôi đã cập nhật câu trả lời. Hy vọng thông tin bổ sung này hữu ích :)
Frazell Thomas

21

Một ví dụ điển hình là Javascript. Bạn muốn nó ở dưới cùng của trang được hiển thị trong trình duyệt bởi vì đây là cách tốt nhất.

Làm thế nào bạn có thể làm điều này từ Chế độ xem dựa trên Bố cục / Trang chủ nơi bạn chỉ có thể truy cập ở giữa trang?

Bạn làm điều này bằng cách khai báo phần ScScript ở cuối trang Bố cục. Sau đó, bạn có thể thêm nội dung, trong trường hợp này Javascript bao gồm (tôi hy vọng!), Từ trang Xem của bạn đến cuối trang bố cục của bạn.


4

Bạn muốn sử dụng các phần khi bạn muốn một chút mã / nội dung hiển thị trong trình giữ chỗ đã được xác định trong trang bố cục.

Trong ví dụ cụ thể mà bạn đã liên kết, anh ấy đã xác định RenderSection trong _Layout.cshtml. Bất kỳ chế độ xem nào sử dụng bố cục đó đều có thể xác định @section cùng tên như được xác định trong Bố cục và nó sẽ thay thế lệnh gọi RenderSection trong bố cục.

Có lẽ bạn đang tự hỏi làm thế nào chúng ta biết Index.cshtml sử dụng bố cục đó? Điều này là do một chút quy ước MVC / Dao cạo. Nếu bạn nhìn vào hộp thoại nơi anh ta đang thêm chế độ xem, hộp "Sử dụng bố cục hoặc trang chính" sẽ được chọn và ngay bên dưới dòng chữ "Để trống nếu nó được đặt trong tệp Dao cạo bắt đầu". Nó không được hiển thị, nhưng bên trong tệp _ViewStart.cshtml đó có mã như:

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

Cách thức hoạt động của viewstarts là mọi tệp cshtml trong cùng thư mục hoặc thư mục con sẽ chạy ViewStart trước khi nó tự chạy.

Đó là những gì cho chúng ta biết rằng Index.cshtml sử dụng Shared / _Layout.cshtml.


Lời giải thích hay của _ViewStart.
ᴍᴀᴛᴛ 5/12/2015

3

Nó cho phép bạn xác định một @Sectionmã trong mẫu mà sau đó bạn có thể đưa vào các tệp khác. Ví dụ: một thanh bên được xác định trong mẫu, có thể được tham chiếu trong chế độ xem được bao gồm khác.

//This could be used to render a @Section defined as @Section SideBar { ...
@RenderSection("SideBar", required: false);

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.