2011-10-08 28 views
5

Tôi muốn tạo phần đầu HTML trong một hành động con; trong khi trang có nhiều hành động con khác. Phần đầu html phụ thuộc vào các hành động khác để xác định tệp js/css nào nên được bao gồm. Các hành động con khác nhau có thể chia sẻ cùng một tệp js/css; và các trang khác nhau có sự kết hợp khác nhau của css/js, vì vậy có một lý do để làm điều đó. Đây là mã mẫu của tôi:Làm thế nào để thay đổi chuỗi các hành động con trong MVC

Layout.cshtml: 
<html> 
<head> 
@RenderZone("header") 
</head> 
<body> 
@RenderZone("zone1") 
@RenderZone("zone2") 
@RenderZone("zone3") 
</html> 

Mỗi vùng có 1 hoặc nhiều hành động con.

RenderZone cũng là một hành động. Chế độ dữ liệu:

Model = GetAllChildActions(zoneName) 

Quan điểm RenderZone:

foreach(var m in Model) 
    @html.action(controller = m.controller, action = m.action) 

Bởi vì vùng Header là đầu nên nó luôn luôn được thực hiện đầu tiên sau đó nó không thể lấy dữ liệu từ những hành động trẻ khác. Tôi đã thử các bộ lọc (onActionExecuted; onActionResultExcuted và vv) nhưng không ai trong số họ hoạt động. Tôi thực sự cần thực hiện hành động tiêu đề sau khi tất cả các hành động con được hiển thị. Tôi không muốn tạo css ở cuối trang. Tôi có thể nhưng tôi không muốn sử dụng javascript để tiêm các tập tin js/css; hoặc viết một mô-đun http để "thủ công" thay đổi html đầu ra. Nó rất dễ dàng để xử lý nó trong webform. Tôi tin rằng có một cách để làm điều đó trong MVC quá. Chúng tôi rất trân trọng bất kỳ sự giúp đỡ nào!

+0

Là một đơn giản 'OrderBy()' không thể? –

+0

Cảm ơn bạn đã trả lời! nhưng không có sẵn sàng cho các hành động (hành động con) trong một trang. Không giống như biểu mẫu Web mà chúng tôi có thể tải kiểm soát người dùng bằng cách tìm ID kiểm soát, dao cạo MVC không cung cấp cách kiểm tra con của trang. – user985287

Trả lời

3

Bạn có thể pre-render của tất cả những hành động trẻ em:

@{ 
    var prerender = new Dictionary<string, MvcHtmlString>(); 
    prerender["header"] = RenderZone("header"); 
    prerender["zone1"] = RenderZone("zone1"); 
} 

Và sau đó trong cơ thể:

@prerender["header"] 

Bằng cách này bạn có thể có tất cả các trẻ em thực hiện thực hiện của họ trước khi vẽ các vùng đầu tiên trong khung nhìn của bạn và lưu trữ các đăng ký script/css trong HttpContext hiện tại.

+1

Có nó hoạt động Ông Pre-render !! Tôi không thể tin rằng đó là một giải pháp đơn giản như vậy! Nó thực sự có một lợi ích khác mà tôi có thể trả lại các hành động bằng cách lặp lại các tên vùng từ cơ sở dữ liệu. Bây giờ tôi hoàn toàn có thể kiểm soát thứ tự hiển thị vùng dựa trên cài đặt của tôi !! Bằng cách dữ liệu không thể được đặt trong chế độ xem/dữ liệu của phụ huynh. Tôi không biết tại sao. Trong bộ điều khiển cơ sở, tôi thêm một phương pháp thử để đặt dữ liệu bằng cách ghi đè OnAction/Result Executing/ed nhưng không hoạt động. Tôi đặt dữ liệu của tôi trong HttpContext.Items và nó hoạt động rất tốt. Cảm ơn bạn một lần nữa, rất nhiều! và cảm ơn bạn đã nhìn thấy để mở một tiền thưởng! – user985287

+0

Tốt để biết về Parent ViewBag, tôi nghi ngờ nhưng nghĩ rằng nó có thể là có thể. HttpContext chỉ là tốt, mặc dù, cuộc gọi tốt. –

+0

Tôi đã sửa đổi câu trả lời để loại bỏ tham chiếu đến ParentActionContext ViewBag và nói để sử dụng HttpContext –

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