2013-01-06 5 views
1

상품 모음이 있습니다. 내보기 모델은 다음과 같습니다.항목 속성에 따라보기에서 항목 목록을 구성하는 방법은 무엇입니까?

public class MyViewModel 
{ 
    public IEnumerable<MyClass> MyCollection { get; set; } 
} 

public class MyClass 
{   
    public string VendorName { get; set; } 
    public decimal Amount { get; set; } 
    public decimal Tax { get; set; }   
} 

그래서 내 컬렉션에는 약 200 개의 행이 있습니다. 여러 행에 동일한 공급 업체 이름을 사용할 수 있으므로 내 컬렉션에 5 개의 다른 공급 업체 이름이 있습니다.

뷰 모델을 전달한다는 관점에서 각 공급 업체의 이름을 표시하고 각 공급 업체에서 그 공급 업체 이름에 대한 금액 및 세금 그리드를 표시하려고합니다.

필자는 내 견해에서이 작업을 수행해야한다고 가정하지만 필자는 정확하게 수행 할 방법이 확실하지 않습니다.

답변

3

저는 뷰 모델이 뷰를 가깝게 수용하고 가능한 한 뷰에서 데이터 조작을 거의하지 않게하는 것을 선호합니다. 결국 데이터를 모양 짓는 것이 사용자에게 드러나는 것은보기의 책임이 아닙니다. 그래서

public class Vendor 
{ 
    public string VendorName { get; set; } 
    public IEnumerable<VendorInfo> VendorData { get; set; } 
} 

public class VendorInfo 
{ 
    public decimal Amount { get; set; } 
    public decimal Tax { get; set; } 
} 

public class MyViewModel 
{ 
    public IEnumerable<Vendor> Vendors { get; set; } 
} 

그래서 당신은 단지 한 번에 공급 업체 이름과 세부 사항에서 UI 요소를 구축 할 수 있습니다 사용합니다.

+0

이렇게 접근하는 방법입니다. 데이터를 반복하지 마십시오. +1 –

0

2 단계 프로세스를 사용할 수 있습니다.

var vendors = MyCollection.Select(myc => myc.VendorName).Distinct(); 

을 그리고 (또는 그냥보기에 그렇게 할 수 - 그 자신의 개인적인 취향에 달려 있습니다)보기에 (MyCollection와 함께) 벤더를 통과해야합니다 : 컨트롤러에서이 작업을 수행. 다음보기에서이 작업을 수행 :

foreach(var vendor in vendors) 
{ 
    var currentCollection = MyCollection.Select(myc => myc.VendorName.Equals(vendor)); 
    foreach(MyClass something in currentCollection) 
    { 
    //Do what you want 
    } 
} 

IEnumerable<MyClass>에 당신이보기에있는 공급 업체 목록을 잡아 때 (어느 ViewBag 또는을 ViewData에 의해) IEnumerable<string>로 다시 캐스팅해야 할 수 있는지 (뿐만 아니라 MyCollection 수), 당신은 잘 가야합니다.

관련 문제