anh ở bên em, Exitos: Tôi tránh sử dụng ViewBag
quá. Bên cạnh cái tên ngớ ngẩn, tôi không thích việc đánh máy yếu đi kèm với nó. Có một giải pháp, nhưng đó là loại tham gia, vì vậy chịu với tôi.
Trước tiên, tạo một lớp để lưu trữ "gợi ý hiển thị" được chuyển đến bố cục. Tôi sáng tạo gọi lớp này "DisplayHints":
public class DisplayHints {
// anything that you want passed from a view to the layout goes here
public bool ShowBanner { get; set; }
}
Sau đó, tạo một lớp bắt nguồn từ WebViewPage<T>
đó sẽ là lớp cơ sở mới của quan điểm của bạn. Lưu ý cách chúng tôi có một tài sản gọi là DisplayHints
đó là lưu trữ trong ViewData
(trong đó có sẵn với bộ điều khiển, quan điểm và cách bố trí):
public abstract class MyViewPage<T> : WebViewPage<T> {
public DisplayHints DisplayHints {
get {
if(!ViewData.ContainsKey("DisplayHints"))
ViewData["DisplayHints"] = new DisplayHints();
return (DisplayHints)ViewData["DisplayHints"];
}
}
}
Là một commenter chỉ ra dưới đây, ViewData
là một cách yếu ớt, đánh máy, giống như ViewBag
. Tuy nhiên, không có cách nào tôi biết để tránh lưu trữ một cái gì đó trong ViewData
/ViewBag
; điều này chỉ giảm thiểu số lượng các biến được đánh máy yếu đến một. Một khi bạn đã làm điều này, bạn có thể lưu trữ càng nhiều thông tin đánh máy mạnh mẽ trong DisplayHints
như bạn muốn.
Bây giờ bạn có một lớp cơ sở cho quan điểm của mình, trong Web.config
, chúng ta cần phải nói với MVC sử dụng lớp cơ sở tùy chỉnh của bạn:
<pages pageBaseType="MyNamespace.Views.MyViewPage">
Có vẻ như rất nhiều rắc rối, nhưng bạn đạt được một số nghiêm trọng chức năng cho tất cả công việc này. Bây giờ trong quan điểm của bạn, bạn có thể đặt bất kỳ gợi ý hiển thị mà bạn muốn như sau:
@{ DisplayHints.ShowBanner = true; }
Và trong cách bố trí, bạn có thể truy cập vào nó cũng giống như một cách dễ dàng:
@if(DisplayHints.ShowBanner) {
<div>My banner....</div>
}
Tôi hy vọng điều này sẽ giúp!
Thú vị, nhưng ViewData vẫn có cùng các vấn đề đánh máy yếu như ViewBag và bạn đã gặp nhiều rắc rối hơn khi đến đó. – Maess
Tôi thích giải pháp này .. và tôi không nghĩ rằng đó là một "nhiều rắc rối hơn" để mở rộng 'WebViewPage' – MilkyWayJoe
Maess, vâng,' ViewData' có cùng vấn đề gõ yếu như 'ViewBag'. Tuy nhiên, thay vì lưu một loạt các gợi ý hiển thị dưới dạng các biến được đánh máy yếu, bạn chỉ tiết kiệm một đối tượng, trong đó bạn có thể đặt bao nhiêu thứ được gõ mạnh như bạn muốn, bao gồm các cấu trúc phức tạp hơn. Trong ứng dụng của tôi, lớp 'DisplayHints' chứa tối đa hai mươi thành viên ... tất cả đều được gõ mạnh mẽ. –