2009-09-13 35 views
39

Làm thế nào tôi có thể truy cập cá thể bộ điều khiển từ chế độ xem? Ví dụ. Tôi có một số HomeController, sau đó trả về chế độ xem Index của tôi. Bên trong chế độ xem đó, tôi muốn truy cập cá thể HomeController đã tạo chế độ xem. Làm thế nào để làm điều đó?ASP.NET MVC: Ví dụ về bộ điều khiển truy cập từ màn hình

+0

Câu trả lời cho câu hỏi này không phải là "bạn không được phép" (c.f. https://stackoverflow.com/q/9562214/1739000)? –

Trả lời

70

ViewContext.Controller và bạn sẽ cần truyền.

<% var homeController = ViewContext.Controller as HomeController; %> 

Điều này được bao phủ thêm một vài nếp nhăn trong bài Asp.Net MVC: How do I get virtual url for the current controller/view?.

EDIT: Điều này là thêm một số thịt vào đề nghị của Mark Seemann rằng bạn giữ chức năng ngoài tầm nhìn nhiều nhất có thể. Nếu bạn đang sử dụng bộ điều khiển để giúp xác định đánh dấu của trang được hiển thị, bạn có thể muốn sử dụng phương pháp Html.RenderAction(actionName, controllerName) để thay thế. Cuộc gọi này sẽ kích hoạt hành động như thể đó là yêu cầu riêng và bao gồm chế độ xem của nó như là một phần của trang chính.

Cách tiếp cận này sẽ giúp thực thi các mối quan tâm tách biệt vì phương pháp hành động được chuyển hướng đến có thể thực hiện tất cả việc nâng hạng nặng liên quan đến các quy tắc trình bày. Nó sẽ cần trả về một phần Xem để hoạt động chính xác trong chế độ xem gốc của bạn.

+0

Đó là những gì tôi đang tìm kiếm. Cảm ơn bạn David – Alex

+0

@ Alex: vui lòng giúp –

+0

@David: RenderAction chỉ có sẵn trong gói Tương lai chính xác? – Alex

28

Theo ý kiến ​​của tôi, bạn nên xem xét thiết kế mà Chế độ xem không cần biết về Bộ điều khiển. Ý tưởng là Bộ điều khiển giao dịch với yêu cầu, gợi lên Mô hình và đưa Mô hình đó ra Chế độ xem. Tại thời điểm đó, công việc của Controller được thực hiện.

Tôi nghĩ đó là dấu hiệu của lỗi thiết kế nếu Chế độ xem cần biết bất kỳ điều gì về Bộ điều khiển. Bạn có thể chia sẻ thêm về những gì bạn đang cố gắng thực hiện?

Tôi thường thấy rằng khi giao dịch với các khuôn khổ được thiết kế tốt (chẳng hạn như khung MVC), nếu bạn cảm thấy như khuôn khổ đang chiến đấu với bạn, có thể bạn đang thực hiện nhiệm vụ theo cách sai. Điều này đã xảy ra với tôi rất nhiều, và bước lùi lại và tự hỏi bản thân điều tôi thực sự cố gắng đạt được thường dẫn đến những hiểu biết mới.

+1

+1 cho điều đó. Nếu các lớp Utility là cần thiết, chúng thường đi vào ViewModel hoặc thành một thực thể hoàn toàn riêng biệt, vì vòng đời của bộ điều khiển nên kết thúc bằng "return". –

+0

Đánh dấu: Tôi đã thêm vào đối số của bạn một chút trong bài đăng của riêng tôi. +1 –

+0

+1 từ tôi nữa. Tôi đã nghĩ về điều này. Những gì tôi đang làm là tôi có một phần xem, tương tự như LogOnUserControl từ dự án khởi động thường xuyên cho ASP.NET MVC. Nó hiển thị tên người dùng (nhưng không đến từ ngữ cảnh Trang/IPrincipal - tùy chỉnh). Bộ điều khiển của tôi đã có một dịch vụ có khả năng cung cấp tên người dùng, và vì vậy tôi muốn lấy cá thể từ bộ điều khiển thay vì tái instantiating trong khung nhìn.Tôi không sử dụng mô hình vì tôi muốn tận dụng lợi thế của Return() thường xuyên và không chạy vào các vấn đề (hãy nhớ, điều này được chia sẻ, vì vậy tôi cần một lớp cơ sở VM vv – Alex

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