2011-02-23 1 views
1

다음 면도기 부분 뷰가 제공되고 Product가 NHibernate 매핑 된 개체라는 점을 이해하면 여기서 IEnumerable을 호출하면 캐시되지 않을 때 데이터베이스 쿼리가 실행됩니다.ASP.NET MVC 3 :보기에 열거 가능한 확장 메서드 사용

이것은 나쁜 습관입니까? 내 컨트롤러/비즈니스 로직에서 이러한 호출을 할 수 있도록이 뷰에 대한 데이터를보다 잘 볼 수 있어야합니까?

@model IEnumerable<MyProject.Data.Models.Product> 
<table> 
    <tr> 
     <th></th> 
     <th>Total Orders</th> 
     <th>Fulfilled</th> 
     <th>Returned</th> 
     <th>In stock</th> 
    </tr> 
    @foreach (var product in Model) { 
     <tr> 
      <td> 
       @Html.ActionLink(product .Name, "Detail", "Product", new { id = product.Id }, null) 
      </td> 
      <td> 
       @product.Orders.Count 
      </td> 
      <td> 
       @product.Orders.Where(x=>x.Fulfilled).Count() 
      </td> 
      <td> 
       @product.Orders.Where(x=>x.Returned).Count() 
      </td> 
      <td> 
       @(product.Stock.Count - product.Orders.Count) 
      </td> 
     </tr> 
    } 
</table> 

답변

1

이것은 나쁜 습관입니까?

예.. 실제로 그것은 MVC 패턴을 깨뜨리고 있습니다. 뷰는 모델을 통해 콜백해서는 안되며, HTML 만 렌더링하면됩니다.

하나의 엔티티 이외의 추가 정보가 필요한 경우, 필요한 모든 정보가 포함 된 ViewModel을 채운 다음 해당 정보를보기로 전달하십시오. 또한

은, 사용하는 디스플레이 템플릿 모델의 IEnumerable을 통해하지 루프를 수행

@Html.DisplayForModel()

이의 장점은 MVC 규칙을 활용하고, 준수, 명시 적 루프 없다 모델 바인딩시 hierachy를 모델링합니다.

+0

일을하는 것은 쉬운 실용적인 방법처럼 보이지만 나는 MVC 관점에서 잘못되었다는 것을 알고 있습니다. –

+0

예. '@Html '이 아니라면 뷰에 코드를 작성할 때마다. '이면 경보 음이 울리며 상황을 단순화하기 위해보기/컨트롤러를 리팩터링해야합니다. ViewModels 또는 Controller에 논리를 넣으십시오. – RPM1984

+0

foreach가 HTML 렌더링 로직을 렌더링하기위한 것이라면, IEnumberable을 모델에서 반복 할 때 아무 문제가 없습니다. 도우미는 훌륭하지만 MVC 패턴을 손상시키지 않습니다. (@ product.Orders.Where (x => x.Fulfilled) .Count()) –