2009-06-05 4 views
7

뷰에는 코드가 없어야하지만 현재 작업중인 프로젝트에서 뷰에 많은 로직이 있다는 것을 알고 있습니다.ASP.NET MVC의 부분 뷰에서 논리 제거

내 홈 페이지는이 같은 논리의 aweful 많이 가지고있는 부분보기 지금

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

있다;

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

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

} %> 
이제

나는 홈 컨트롤러가 비어있는 목록에 따라 다른보기를 반환 할 수 있지만 난 정말하지 않는 인덱스보기 내가 상관없이 표시 할 몇 가지가 있습니다로 결과가있는 지 여부.

여기서 내가 생각할 수있는 유일한 다른 점은 Html.SearchResults와 같은 도우미 메서드에서이를 캡슐화하는 것입니다. 하지만 각 탐색 결과에 대해 renderPartial을 호출하는 도우미가 필요합니다. 그것은 깨끗한 분리의 분리처럼 보이지 않습니다.

부분 뷰에서 첫 번째 if 문이 있어야합니다.

어떻게 처리하면 좋을까요?

+0

+1 항상이 경우 가장 좋은 방법이 무엇인지 궁금합니다. –

답변

13

개인적인 의견은 괜찮습니다. 사용했던 논리는 모델을 표시해야하는 방식과 완전히 관련되어 있습니다.

비즈니스 논리, 데이터 액세스 논리 또는 모델 디스플레이에 엄격히 묶여 있지 않은 다른 요소를 절대로 혼동하지 않도록하십시오.

+0

그래, 그게 궁금 했어. 따라서 디스플레이 로직은 괜찮습니다. 곧 답변 드리겠습니다. 먼저 다른 의견이 있는지보고 싶습니다.) – ddd

10

나는 Praveen Angyan의 답변에 동의합니다. 그의 대답을 확장하기 위해 말할 수있는 유일한 방법은 ViewModel에 로직 중 일부를 배치하는 것입니다.

뷰 모델의 예를 들어, 당신은 메서드 또는 속성 뒤에

Model.restaurantsList.Count() > 0

을 숨길 수 있습니다.

예컨대 :

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

이 답변이 질문과는 아무 상관이 없습니다.

그러나 루프 내에서 Html.RenderPartial()을 호출하면 이 효과적이지 않음을 알리고 싶습니다..
ASP.NET MVC - For loop inside RenderPartial or Outside RenderPartial

아래와 같이 변경하면 더 좋을 것입니다.

<%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

mvc3에서 변경된 사항이 없으면 이것이 사실입니다. 뷰 엔진은 발견 된 부분을 캐싱하지 않으며 모든 반복을 '다시 채워야'합니다. –

1

Praveen Angyan은 정확합니다.보기 논리이며 올바른 위치에 있습니다.
하지만보기 좋게보기에는 바뀌지 않습니다.

작은 개선 만 공유하고 싶었습니다.이 읽을 수있는 좋은 보이지 않을 수도 있지만, 충분히 나를 위해 좋은 적합 - 일부

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

을 : 우리는 작은 Html 헬퍼 방법을 첨부 할 경우
, 우리는 이런 식으로보기를 단축 할 수 있습니다.