2009-06-05 18 views
7

Tôi biết rằng các khung nhìn không nên có mã trong chúng nhưng trong một dự án tôi đang làm việc trên tôi có rất nhiều logic trong các khung nhìn.Xóa logic khỏi các khung nhìn từng phần trong ASP.NET MVC

trang chủ của tôi có

<% Html.RenderPartial("SearchResults"); %> 

Bây giờ trong giao diện phần tôi thực sự lo aweful logic như thế này;

<div id="RestaurantsList"> 
<%if (Model.restaurantsList.Count() > 0) 
{ 
    foreach (var item in Model.restaurantsList) 
    { %> 
     <% Html.RenderPartial("SearchResult", item); %> 

    <% 
    } %> 
<% 
} 
else 
{ 
    Html.RenderPartial("NoResults"); 

} %> 

Bây giờ tôi có thể làm cho bộ điều khiển nhà trở lại một cái nhìn khác nhau dựa trên danh sách là rỗng nhưng tôi không thực sự muốn điều đó như xem Index có một vài điều mà tôi muốn hiển thị không có vấn đề nếu có kết quả hay không.

Điều duy nhất tôi có thể nghĩ đến ở đây là gói gọn trong phương thức trợ giúp như Html.SearchResults. Nhưng sau đó tôi sẽ cần người trợ giúp để gọi renderPartial cho mỗi kết quả tìm kiếm. Điều đó dường như không phải là mối quan tâm sạch sẽ.

Tôi vẫn sẽ phải có câu lệnh if đầu tiên trong phần xem mặc dù.

Bạn sẽ xử lý tốt nhất điều này như thế nào?

+0

+1 Luôn tự hỏi thực hành tốt nhất là gì trong trường hợp này. –

Trả lời

13

Ý kiến ​​cá nhân của tôi là điều này không sao. Logic mà bạn đã sử dụng hoàn toàn liên quan đến cách mô hình cần được hiển thị.

Bạn chỉ cần lưu ý và đảm bảo rằng bạn không bao giờ trộn lẫn trong logic nghiệp vụ, logic truy cập dữ liệu hoặc bất kỳ thứ gì khác không được gắn chặt vào hiển thị của mô hình.

+0

Vâng tôi tự hỏi điều đó. Vì vậy, nó là ok cho logic hiển thị. Tôi sẽ sớm chấp nhận câu trả lời của bạn. Tôi muốn xem nếu có bất kỳ khác oppinions đầu tiên;) – ddd

10

Tôi đồng ý với câu trả lời của Praveen Angyan. Điều duy nhất tôi có thể nói để mở rộng câu trả lời của mình là đưa một số logic vào ViewModel.

Ví dụ trong ViewModel bạn có thể che giấu

Model.restaurantsList.Count() > 0

đằng sau một phương pháp hay tài sản.

ví dụ .:

<%if (Model.HasResturant){...}%> 
1

câu trả lời này không có gì để làm với câu hỏi của bạn. Tuy nhiên, tôi chỉ muốn cho bạn biết rằng gọi Html.RenderPartial() trong vòng lặp là không hiệu quả.
ASP.NET MVC - For loop inside RenderPartial or Outside RenderPartial

Thay đổi thành thứ như sau sẽ tốt hơn.

<%if (Model.restaurantsList.Count() > 0) 
{ 
    // render the Restaurant item right away 
    foreach (var item in Model.restaurantsList) { %> 
     <div> 
      <%= Html.Encode(item.RestaurantName); %><br /> 
      <%= Html.Encode(item.Address); %> 
     </div> 
    <% } 
} 
else 
{ 
    Html.RenderPartial("NoResults");  
} %> 
+0

trừ khi trong mvc3 một cái gì đó đã thay đổi này là hoàn toàn đúng sự thật. các viewengines không cache các partials đã được tìm thấy, và sẽ phải 'refind' chúng mỗi lần lặp. –

1

Praveen Angyan là chính xác - đó là chế độ xem logic và mọi thứ đều ổn.
Nhưng điều đó không thay đổi cần thiết cho tầm nhìn đẹp hơn.

Chỉ muốn chia sẻ cải tiến nhỏ.
Nếu chúng tôi đính kèm phương pháp HtmlHelper nhỏ, chúng ta có thể rút ngắn thời xem một cái gì đó như thế này:

<div id="RestaurantsList"> 
<% if (Model.HasRestaurants) 
    Html.RenderPartialForEach("SearchResult", Model.restaurantsList);  
else  
    Html.RenderPartial("NoResults"); %> 
</div> 

Đối với một số - nó có thể không tìm đọc được và tốt đẹp, nhưng nó phù hợp cho tôi đủ tốt.

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