2010-07-31 2 views
1

음악 상점 응용 프로그램의 asp.net/mvc에 대한 자습서를 통해 작업하고 있습니다.MVC 2 viewmodels 질문

참조 : 그들이보기 모델로 장르의 목록을 전달하는 컨트롤러에서 http://www.asp.net/mvc/tutorials/mvc-music-store-part-3

가, 난 그냥 초보자입니다하지만 그것도보기 형식을 무엇에 데이터를 표시하는 뷰 모델의 일이다 같은 느낌 필요합니다. 튜토리얼 코드는이 작업을 수행

...

public ActionResult Index() 
{  
    // Retrieve list of Genres from database  
    var genres = from genre in storeDB.Genres select genre.Name;  

    // Set up our ViewModel  
    var viewModel = new StoreIndexViewModel() 
    {   
     Genres = genres.ToList(),   
     NumberOfGenres = genres.Count() 
    }; 

    // Return the view  
    return View(viewModel); 
} 

내가하고 싶은 것은 NumberOfGenres 속성을 목록을 만들뿐만 아니라 설정 뷰 모델과 뷰 모델 내부 패스 장르이다. 이것이 코딩되는 방식은 컨트롤러가 필요한 것보다 더 많은 뷰를 알아야한다는 것입니다.

내 viewModel 내부의 genres 속성에서 ToList() 및 Count() 메서드를 사용하려면 내 viewModel 클래스가 어떻게 보이는지 보여 줄 수 있습니까?

+0

나는 이것이 작동하기에 가까워 졌다고 생각하지만, 그것을 빌드 할 때 유형 변환 오류가 발생합니다. – JBeckton

답변

1

나는 당신과 의견을 달리 할 것입니다. 컨트롤러는 뷰에 대해 아무것도 모르고 모델 만 알 수 있습니다. 뷰 모델 인 IMO는 튜토리얼에서와 같이 단순한 컨테이너 여야합니다. 컨테이너로 데이터를 채우고보기로 전달하는 것은 컨트롤러의 임무입니다.

뷰 모델이 필요한만큼 간단한 지 여부, 즉 해당 목록에서 장르 수를 쉽게 파생시킬 수 있는지 여부는 공개 된 질문이므로 별도의 속성으로 가질 필요는 없습니다. 모델에리스트를 저장하고 싶다면 컨트롤러에서 수행하는 대신 뷰에서 Count() 메소드를 호출하면됩니다.

튜토리얼에 대해 잘 모르는 상태에서 모델에 페이징을 추가 할 것을 기대하면서이 방법을 사용했는지 확신 할 수 없습니다. 모델에서 페이징을 지원하려면 컬렉션의 일부만보기로 전달하기 때문에 총 개수를 별도의 속성으로 지정해야합니다.

+0

정중하게, 모델에 이미있는 경우 다른 "간단한 컨테이너"가 필요한 이유는 무엇입니까? ViewModel이 asp.net MVC와 관련되어 있기 때문에 viewModel을 이해하지 못하는 것이 가능할 수도 있지만 뷰에 액세스 할 데이터의 컨테이너가 아닌 뷰의 표현 자처럼 생각했습니다. 실제로 그것이 단순한 컨테이너 일뿐만 아니라 날짜 형식 지정, 쿼리 결과 등의 목록과 같은 데이터 형식 만들기 등과 같은 작업을 처리하는 발표자라고 생각했습니다. 다른 플랫폼에서 MVC 패턴을 사용했기 때문에 필요할 수 있습니다. 오래된 습관을 없애기 위해서. – JBeckton

+0

좋아, 몇 가지 조사를 한 후에 알게된다. ViewModel의 주된 이점은 강력하게 형식화 된 클래스 대 문자열 기반 사전입니다. – JBeckton

+0

@JBeckton -하지만 모델을 사용하여보기를 강력하게 입력 할 수는 있지만 ViewModel이 반드시 필요한 것은 아니므로 이것이 주된 이점인지는 확실하지 않습니다. – UpTheCreek

1

내가 틀릴 수도 있지만 viewModel의 생성 방법에 대해 혼란 스러울 것 같습니다. 코드는 당신이 묘사 한 것과 정확히 일치합니다.

ToList() 메서드는 위에서 작성한 쿼리 결과를 List로 반환합니다. ToList()가 호출 될 때까지 실행되지 않는다는 것을 명심하십시오.

데이터베이스에서 결과를 얻은 후 StoreIndexViewModel 클래스의 속성에 할당됩니다. 당신은 뷰 모델의 목록을 생성하지 않습니다

: 우리는 다른 방법으로 코드를 작성하는 경우

public ActionResult Index() 
{  
    // Retrieve list of Genres from database  
    var genres = from genre in storeDB.Genres select genre.Name; 
    var genresList=genres.ToList();  

    // Set up our ViewModel  
    StoreIndexViewModel viewModel = new StoreIndexViewModel() 
    viewModel.Genres=genresList; 
    viewModel.NumberOfGenres=genresList.Count; 

    // Return the view  
    return View(viewModel); 
} 

업데이트를 쉽게 이해 될 수있다. 데이터베이스에서 가져옵니다. LINQ 표현식을 살펴 본다면 장르 이름 만 가져옵니다. 나중에 이러한 결과는 클래스의 속성에 할당됩니다.

ViewModels는보기에 추가 정보를 제공하는 데 사용됩니다. 여기에서는 다른 장르 만 보여주기 위해 사용됩니다. 사용자 이름 만 사용하므로 사용자가 찾아 볼 수 있습니다. 튜토리얼을 확인하지는 않았지만 장르를 작성, 삭제 또는 편집하는 데는 자체 기능이 필요했습니다.

+0

완전히 틀린 것은 아니지만 다소 혼란 스럽지만 아마 viewModel이 수행해야하는 작업에 관한 것입니다. 내가하고 싶었던 것은 viewModel이 컨트롤러에서 그것을 수행하고리스트를 viewModel에 전달하는 대신리스트를 생성하도록 처리하는 것입니다. – JBeckton

+0

내 업데이트를 참조하십시오. 나는 그것이 그것을 더 분명하게 바란다. –

+0

좋아, 일부 연구 후에 나는 그것을 얻는다. ViewModel의 주된 이점은 강력하게 형식화 된 클래스 대 문자열 기반 사전입니다. – JBeckton