2011-11-07 42 views
12

Trên trang web của tôi, tôi có một phần (một thanh bên nổi) mà tôi muốn hiển thị chỉ cho một tập hợp con người dùng (quản trị viên). Tôi hy vọng rằng tôi có thể đặt logic trong bố cục chính để xác định xem phần đó có nên được hiển thị hay không nhưng điều đó gây ra lỗi trên trang nếu phần đó không được hiển thị.Làm cách nào để tùy chọn hiển thị một phần trong ASP.Net MVC 3?

Ví dụ mã - Layout.cshtml ... Mã

... code ... 
@if(user.IsAdmin) { 
    @RenderSection("AdminSidebar", false) 
} 

Ví dụ - MyPage.cshtml ...

@section AdminSidebar { 
    ... code ... 
} 

Có ai biết làm thế nào để có được điều này để làm việc mà không cần phải đặt logic trong tất cả các trang con?

Lưu ý, IsSectionDefined ("AdminSidebar") chỉ hoạt động trong tệp bố cục. Nó không hoạt động trong trang để kiểm tra xem phần có sẵn hay không.

Trả lời

16

Tôi không biết nếu điều này không được lạm dụng khuôn khổ này, nhưng nếu bạn thực sự có khuynh hướng đi theo con đường mà bạn có thể thử như sau:

@{ 
    if(user.IsAdmin) { 
     @RenderSection("AdminSidebar", false) 
    } 
    else { 
     RenderSection("AdminSidebar", false).WriteTo(TextWriter.Null); 
    } 
} 
+1

Thông minh. Tôi thích nó. Tôi ước rằng khung MVC chỉ bỏ qua các phần không được định nghĩa thay vì ném lỗi, nhưng điều này cho phép tôi xác định phần theo cách tôi muốn. – Brian

+0

@Brian Nhưng tại sao không sử dụng renderPartial như đề xuất bởi itsmatt, nó sạch hơn nhiều? – gdoron

+0

Bởi vì sau đó tôi sẽ phải tạo một phần cho mỗi trang mà tôi muốn thêm một thanh bên (nó theo ngữ cảnh dựa trên trang). – Brian

0

Sử dụng một phần cho điều gì đó có điều kiện dựa trên mức độ cho phép người dùng cảm thấy hơi bẩn đối với tôi. Tôi sẽ sử dụng RenderPartial (người dùng) và đặt logic trong một phần.

@if(user.IsAdmin) { 
     ..code.. 
    } 
1

Trong file _Layout.cshtml của tôi, tôi đã làm một cái gì đó như thế này:

@if(user.IsAdmin) 
{ 
    @Html.Partial("SideBar") 
} 

để tránh việc phải có tất cả các trang con đã để đối phó với các phần bắt buộc trong về cơ bản theo cách tương tự. Khi tôi lần đầu tiên thử phần tùy chọn, tôi thấy rằng tôi đã lặp lại chính mình trong các trang con, ít nhất là trong việc thực hiện của tôi.

Nơi tôi đã sử dụng cuộc gọi @RenderSection cho các phần tùy chọn, thường là cung cấp nội dung cụ thể cho từng trang.

+0

Cảm ơn, nhưng tiếc là mỗi trang có thể có các yếu tố khác nhau trong thanh bên (về cơ bản nó là một tập hợp các công cụ theo ngữ cảnh) nên điều này sẽ không hoạt động. – Brian

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