ASP.NET MVC 모델 대 ViewModel


92

좋아, MS의 ASP.NET MVC와 관련하여 "ViewModels"에 대한 논의를 들었습니다.

자, 그것은 특정 종류의 모델을 의도 한 것입니다. 맞습니까? 특정 종류의보기가 아닙니다.

내 이해로는 뷰와 상호 작용하는 특정 목적을 가진 일종의 모델입니까? 아니면 그런가요?

약간의 설명을 주시면 감사하겠습니다.

답변:


71

본질적으로 Model과 View Model은 둘 다 속성이있는 단순한 클래스입니다.

이 클래스의 주요 목적은 컨트롤러와 뷰인 각각의 청중에 대한 개체를 설명하는 것입니다 ( "모델"에 대해).

그래서 당신이 말할 때 당신은 완전히 옳습니다

내 이해로는 View와 상호 작용하는 특정 목적을 가진 일종의 Model입니다.

따라서 모델 클래스는 애플리케이션이 상호 작용하는 도메인 엔터티 인 반면보기 모델은 뷰가 상호 작용하는 간단한 클래스입니다.

도움이되기를 바랍니다 :)

업데이트 :

Microsoft는 주로 Model-View-Controller를 기반으로하는 Martin Fowler의 Presentation Pattern의 특수 버전을 개발했으며이를 PF 애플리케이션 용 MVVM (Model-View-ViewModel)이라고합니다. 이 패턴은 UI 개발자가 기존 개발자보다 비즈니스 로직을 기반으로 다른 요구 사항이있는 최신 UI 개발 플랫폼을 대상으로합니다. 여기 에서 약간의 이론을 살펴보십시오.


1
좋아요, 고마워요, 그리고 업데이트에 대해서도 감사합니다. 그렇다면 재고 MVC 2를 사용하는 MS의 특별 버전을 고려하지 않고 ViewModels를 특별한 지정된 폴더에 배치합니까? 아니면 본질적으로 다른 것들과 마찬가지로 Models 폴더에 바로 넣을 수 있습니다. 아니면 둘 중 하나를 할 수 있습니까?
Qcom

아니에요. 일반적으로 모델과 뷰 모델을 참조하는 도메인과 관련하여 그룹화하고 싶기 때문에 동일한 폴더에 배치합니다.하지만 그것은 제가 선택한 것이며 더 나은 것이 있다고 확신합니다
Lorenzo

5
ViewModel은 (domain) Model에서 View를 분리해야합니다. 따라서 ViewModel을 Model이 아닌 View 근처에 두는 것이 좋습니다.
Vitaliy Ulantikov 2011-08-29

Model 폴더가 아닌 MVC 프로젝트 외부에 'Model'클래스를 유지합니다. 그러나 Vitaliy가 View 근처에 있도록 MVC 프로젝트 내부에 View Model 클래스를 유지합니다.
Dan Harris

@Lorenzo 첫 번째 줄에서 "속성이있는 두 가지 간단한 클래스"라고 말합니다. 나는 당신이 속성을 의미한다고 생각합니까? 그렇지 않다면 어떤 속성을 언급 했습니까? 속성속성
xr280xr

69

가장 간단한 용어로 저는 다음을 생각하고 싶습니다.

모델 : 엄격하게 데이터 모델처럼 보이고 느껴집니다. 모든 의도와 목적을 위해 데이터 모델의 클래스 표현 일뿐입니다. 보기 또는보기 내의 요소에 대한 지식이 없습니다. 즉, 뷰에 사용할 속성 데코레이터 (예 : 필수, 길이 등)를 포함해서는 안됩니다.

보기 모델 : 보기와 모델 사이의 데이터 바인더 역할을하며 많은 경우 모델의 래퍼이기도합니다. 뷰 없이는 쓸모 없게 렌더링되므로 일반적으로 표준 모델처럼 여러 뷰 및 컨트롤러에서 재사용 할 수 없습니다.

예를 들어 모델에는 데이터 소스를 직접 표현하는 다음 속성이있을 수 있습니다.

    public string FirstName { get; set; }
    public string LastName { get; set; }

이제보기 모델이보기에 연결되어 있기 때문에 모델의 FirstName 필드와 LastName 필드를 하나의 문자열로 연결하는 다음 속성을 가질 수 있습니다.

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}

2
ViewModel의 더 완전한 예를 제공 할 수 있습니까? myModel이 무엇인지 어떻게 알고 myModel에 대한 데이터를 어떻게 얻습니까?
M Kenyon II

5
본질적으로 ViewModel은 POCO (plain-old C # object)이며 데이터 모델이 어떻게 생겼는지 결코 알 수 없습니다. 뷰에 표시해야하는 특정 요소와 데이터 모델의 하이브리드에 가깝습니다. 데이터를 얻는 방법에 관해서는 데이터와 함께로드해야합니다. 데이터에 대한 서비스를 호출 한 다음 해당 데이터를 내 ViewModel에 수동으로로드하는 별도의 중간 클래스를 사용하고 싶습니다. 그런 다음 완전히로드 된 ViewModel을 컨트롤러 작업에 반환합니다.
Jason Marsell

26

이 기사는 특히 바인딩과 관련하여 "도메인 모델"과 "보기 모델"이 MVC 응용 프로그램 내에서 상호 작용하는 방식을 이해하는 데 매우 유용한 리소스라는 것을 알았습니다. 무엇보다도 추상적 인 설명 대신 예제가 포함됩니다.

"MVC가 출시 된 이후로 저는 뷰 모델을 가장 잘 구성하는 방법에 대해 많은 혼란을 목격했습니다. 모범 사례 권장 사항에 대한 많은 정보가없는 것처럼 보이기 때문에 때때로 이러한 혼란이 정당한 이유 없이는 아닙니다. 또한 그렇지 않습니다. 은색 총알 역할을하는 "하나의 크기로 모두 적합"솔루션입니다.이 게시물에서는 몇 가지 주요 패턴과 각각의 장단점에 대해 설명합니다. 이러한 패턴 중 많은 부분에 유의해야합니다. 실제 문제를 해결하는 사람들에게서 나왔습니다. "

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx


19

WikiPedia는 SO 답변에서 얻을 수있는 것보다 Model vs. ModelView에 대한 더 완전한 설명을 제공합니다. http://en.wikipedia.org/wiki/Model_View_ViewModel

나는 인용한다 :

모델 : 클래식 MVC 패턴에서와 같이 모델은 (a) 실제 상태 콘텐츠를 나타내는 개체 모델 (개체 지향 접근 방식) 또는 (b) 해당 콘텐츠를 나타내는 데이터 액세스 계층 (데이터- 중심 접근).

보기 : 클래식 MVC 패턴에서와 같이보기는 버튼, 창, 그래픽 및 기타 컨트롤과 같이 GUI에 표시되는 모든 요소를 ​​참조합니다.

ViewModel : ViewModel은 View와 Model 사이의 데이터 바인딩에도 사용되는 View의 추상화를 의미하는 "View의 모델"입니다. 모델 정보를보기 정보로 변경하고보기에서 모델로 명령을 전달하는 데이터 바인더 / 변환기 역할을하는 컨트롤러 (MVC 패턴에서)의 특수한 측면으로 볼 수 있습니다. ViewModel은 공용 속성, 명령 및 추상화를 노출합니다. ViewModel은 모델에있는 데이터의 실제 상태와 반대로 데이터의 개념적 상태에 비유되었습니다.


3
Model 및 ViewModel에 대한 설명이 있지만 해당 링크는 MVVM 아키텍처 패턴을 설명하는 것입니다. 모델과 뷰 모델의 차이가 아닙니다
Lorenzo

5

ViewModel이라는 개념이 있지만 일반적으로 Asp.net MVC와 관련이 없습니다. MVC는 컨트롤러가 상호 작용을 처리하고 모델에서 데이터를 빌드 한 다음 표시를 위해 해당 데이터를 뷰로 전달하는 Model View Controller 패턴을 사용합니다.

ViewModels (및 Model View ViewModel 패턴)는 일반적으로 Silverlight 및 WPF와 관련이 있습니다. Xaml은 뷰가 ViewModel에 양방향 바인딩을 수행 할 수 있다는 점에서 약간 다르므로 기술이 약간 다릅니다. 예를 들어 텍스트 상자를 필드에 바인딩하면 해당 텍스트 상자에 입력 할 때 필드 값이 동적으로 업데이트됩니다. 웹 페이지는 상태 비 저장이기 때문에 이러한 종류의 상호 작용은 웹 페이지에서 실제로 가능하지 않습니다.

두 패턴의 유사점은 둘 다 디스플레이에서 로직을 분리하려고한다는 것입니다. 가장 일반적인 사용 / 이유는 테스트입니다. 사용자가 사용자 인터페이스를 통해 호출 할 모든 상호 작용을 코드 (테스트 프레임 워크를 통해)에서 수행 할 수 있기를 원합니다.


내가 읽고있는 "Professional ASP MVC 2"라는 책에서 ViewModel은 강력한 형식과 DRY 모두에서 프레젠테이션 / 모델 상호 작용을 유지하는 수단으로 1 장에 소개되었습니다. Microsoft 작성자로는 Scott Hansleman, Phil Haack, Scott Guthrie가 있습니다.
Berryl

최근에 ViewModel이 Asp.net MVC에서 사용되고 있다는 것을 더 많이 보았습니다. ViewModel은 도메인 모델보다 뷰에 더 많은 비즈니스가있는 것처럼 보입니다. 그래서 우리가 사용해온 패턴은 도메인 모델이 ViewModel의 주요 부분을 모으는 것입니다. 현재 우리는 도메인 모델과 함께 작업을 수행하는 수정 된 명령 패턴 (작업)을 사용합니다. 결과는 ViewModel로 어셈블되어 뷰로 전송됩니다. 이 경우 뷰 모델은 뷰를 지원하는 모든 어노테이션과 단순하고 집중된 로직을 보유합니다.
Sinaesthetic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.