11

Tôi đã gặp sự cố với vấn đề sau trong Rails và ASP.Net MVC. Thông thường, có nhiều tiện ích chức năng trên một trang, nhưng một hành động điều khiển được cho là hiển thị trang. Hãy để tôi minh họa:Giải pháp thanh lịch cho lượt xem không liên quan trong khung công tác web MVC là gì?

Giả sử tôi có trang web thương mại điện tử bình thường và menu được tạo thành từ các danh mục, trong khi trang hiển thị một nhóm sản phẩm.

Đối với các sản phẩm, chúng ta hãy nói rằng tôi có một hành động trên một bộ điều khiển trông giống như sau:

def product_list 
    @products = Products.find_by_category(:name => 'lawnmowers') 
end 

Và tôi có một bố cục với cái gì đó như

<div id="menu"><%= render :partial => 'menu' %></div> 
<div id="content"><%= yield %></div> 

Các sản phẩm có một cái nhìn. ..

<%= render :partial => 'product', :collection => @products %> 

(lưu ý tôi đã Bỏ qua phần quan điểm sản phẩm như irre levant)

Và menu có phần ...

<% Category.each {|c| %> 
    <%= render :partial => 'menu_node', :locals => { :category => c } %> 
<% } %> 

Dòng Tôi có một vấn đề với là "Category.each.do" trong giao diện. Tôi đang tìm nạp dữ liệu trong chế độ xem, thay vì sử dụng các biến đã được đặt và bị ràng buộc trong bộ điều khiển. Và nó có thể dễ dàng là một cuộc gọi phương thức phức tạp hơn để tạo ra menu.

Các giải pháp tôi đã xem xét là:

-A xem mô hình lớp cơ sở đó biết làm thế nào để thu được các mảnh dữ liệu khác nhau. Nhưng bạn có thể kết thúc với một trong những điều này cho mỗi "phần" khái niệm của trang web.
biến địa phương -a mà populates ở phía trên cùng của mỗi phương pháp (vi phạm DRY) -the điều tương tự, nhưng trong một cuộc gọi before_filter

Không ai trong số những vẻ rất thanh lịch với tôi. Tôi không thể không nhìn vào vấn đề này và nghĩ rằng một người trình bày MVP cho mỗi lần xem (không phải màn hình) là một giải pháp thanh lịch hơn.

ASP.Net MVC có hành động hiển thị (khác với đường dẫn render: action), không giải quyết vấn đề này, nhưng tôi không chắc mình nghĩ gì về giải pháp đó.

Suy nghĩ? Đề xuất giải pháp?

Added Lưu ý: Những câu trả lời cung cấp cho đến nay là những gợi ý tốt. Và chúng áp dụng cho ví dụ mà tôi đưa ra, trong đó trình đơn có thể xuất hiện trong mọi bố cục và rõ ràng là thứ yếu đối với dữ liệu sản phẩm.

Tuy nhiên, điều gì xảy ra nếu rõ ràng không có công dân hạng hai? Các trang web loại cổng thông tin thường có nhiều tiện ích không liên quan, trong đó mỗi tiện ích quan trọng.

Ví dụ: Điều gì xảy ra nếu trang này đang hiển thị xu hướng thời tiết, với các tiện ích cho nhiệt độ, độ ẩm và lượng mưa (và mỗi loại là kiểu và kiểu xem khác nhau).

+0

câu hỏi hay. Tôi đã đấu tranh với điều này là tốt, như ứng dụng của tôi có tiềm năng cho nhiều 'vật dụng'. Tôi nghĩ rằng mỗi widget nên có Controller riêng của nó mà biết làm thế nào để gửi nó đó là dữ liệu, nhưng chỉ không chắc chắn làm thế nào nó sẽ được thực hiện trong ASP.NET MVC. –

+0

Tôi có xu hướng sử dụng RenderAction trong các trường hợp này, nhưng như bạn đã nói, nó hoàn hảo. – DanP

+0

DanP, bạn đang đề cập đến đường ray hoặc mvc asp.net? –

Trả lời

3

Trong đường ray, chúng tôi muốn có khái niệm về bộ điều khiển mỏng, mô hình dày. Vì vậy, tôi nghĩ rằng bạn đúng khi không muốn có các biến được đặt trong bộ điều khiển.

Ngoài ra, để cho phép một phương pháp hơn-phức tạp sau này, tôi khuyên bạn nên làm một cái gì đó như:

/app/controllers/application_controller.rb

before_filter :add_menu_nodes 

def add_menu_nodes 
    @menu_nodes = Category.menu_nodes(current_user) 
end 

/app/views/layouts/application.html.erb

<%= render :partial=>:menu, :locals=>{:categories=>@menu_nodes} %> 

/app/models/category.rb

def self.menu_nodes(current_user) 
    Category.all.order(:name) 
end 

Bằng cách đó trong tương lai bạn có thể cập nhật Category.menu_nodes với một giải pháp phức tạp hơn, dựa trên người dùng hiện tại, nếu bạn cần.

+0

cảm ơn, đây là một bài viết hay. đây có lẽ là giải pháp sạch nhất mà tôi đã nhìn thấy ở phía bên đường ray. Nó cho rằng dữ liệu này là cần thiết trên mỗi bố cục. Và nó ngụ ý mô hình dữ liệu lớp 2 (loại) có thể không phải là trường hợp. nhưng tôi nghĩ rằng đó là không thể tránh khỏi trong mvc mà bạn có vấn đề đó. –

1

Hãy tha thứ cho tôi nếu tôi mổ thịt Ruby (hoặc hiểu lầm câu hỏi của bạn), nhưng những gì xảy ra với

class section_helper 
    def menu(section) 
     // ... 
     menuBuiltAbove 
    end 
end 

trong giao diện

<%= section_helper.menu('section') %> 

?

+0

đó không phải là một gợi ý xấu, nhưng nó giả định rằng menu là thứ 2 lớp công dân cho sản phẩm. Trong trường hợp của một thực đơn, tôi đồng ý. Nhưng có những trường hợp không phải như vậy. Đây là trung tâm lý do tại sao tôi đã thấy mvc là tuyệt vời cho các trang web đơn giản, nơi mỗi trang có một mục đích rõ ràng, nhưng đối với các trang web loại cổng thông tin, tôi nghĩ rằng các mô hình đấu tranh. –

+0

@Tim Hoolihan Tôi nghĩ rằng tôi thấy vấn đề của bạn là gì. Đối với cổng thông tin tôi đã sử dụng jquery để thực hiện cuộc gọi ajax đến các bộ điều khiển và sau đó cập nhật phía máy khách widget. Có lẽ ý tưởng đó sẽ giúp? –

+0

đó là một giải pháp thực tế mà tôi nghĩ là tốt, nhưng tôi nghĩ rằng tôi đang tìm kiếm thêm một giải pháp mẫu. và trên các trang web quan trọng về hiệu suất, chúng tôi đang thêm các yêu cầu http. –

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