2012-04-10 31 views
11

Tôi có chế độ xem và tôi muốn sử dụng trang bố cục. Trong trang bố cục, tôi muốn có một biểu ngữ có điều kiện mà một số chế độ xem sẽ bật/tắt. Chỉ cần tự hỏi làm thế nào tôi có thể làm điều này?Tôi làm cách nào để đặt biến trên trang _Layout?

Tôi có điều này trong trang _Layout.cshtml ...

@if (ShowBanner){ 

    <h1>banner</h1> 

} 

Tôi đang tự hỏi làm thế nào tôi có thể bật/tắt từ trang MVC Xem của tôi? Hoặc liệu đây có phải là điều đúng để làm không? Tôi có nghĩa là nếu tôi tuyên bố rằng biến trong trang Xem chắc chắn các bậc thầy không biết về nó? Làm thế nào để hai giao tiếp thông qua C#? Tôi có sử dụng Viewbag không? Thay vào đó không.

Tôi biết với các hình thức của nó tất cả về tham khảo trang hoặc Thạc sĩ các thành viên, chỉ không thể khá dường như nhìn thấy nó với MVC ...

Bất kỳ giúp nhiều đánh giá cao ...

Cảm ơn Pete

Trả lời

12

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!

+0

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

+0

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

+0

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ẽ. –

3

Có một mô hình cho bố cục của bạn không phải là một ý tưởng tốt vì nó sẽ buộc tất cả các chế độ xem sử dụng mô hình đó. Tuy nhiên, bạn có thể đặt loại thông tin đó vào ViewBag và có giá trị được điền trong hàm tạo của một trong các cơ sở bộ điều khiển của bạn.

+1

Bạn thậm chí có thể có bộ điều khiển cơ sở luôn đặt biến trong ViewBag – Joe

+0

Tất nhiên, tôi không chắc liệu OP có luôn sử dụng cùng cơ sở bộ điều khiển hay không. – Maess

+0

nếu bạn có thể đặt biến trong viewbag, tại sao bạn không thể gõ mạnh vào bộ điều khiển? – liang

-1

Hãy thử một cái gì đó như thế này:

trên bộ điều khiển của bạn

var yourVariable; 
// other stuff and eventually fill the 'yourVariable' variable 
ViewBag.YourVariable = yourVariable; 

sau đó vào tầm nhìn của bạn

@if (ViewBag.YourVariable){ 

    <!-- Your markup --> 

} 
Các vấn đề liên quan