2012-10-14 6 views
2

새로운 프로젝트를 진행하고 있으며 이전 프로젝트의 어려움을 본 후 모델에서 뷰의 분리를 충분히 제공하지 못했습니다 (특히 MVC 사용 - 모델과 뷰가 서로 조금씩 흘러 나오기 시작 함).), MVVM을 사용하고 싶었습니다.ViewModel을 구축 할 때 적절한 세분성은 무엇입니까?

기본 개념을 이해하고 있으며 사용하기 시작했습니다. 그러나, 저를 조금 벗어나는 한 가지 - ViewModel에 어떤 데이터가 포함되어야합니까?

예를 들어, 나는 그들이 형태로 편집 할 수 있도록 데이터의 두 가지를 포함하는 뷰 모델을 만드는 오전하다면 나는이처럼 캡처 않습니다

public PersonAddressViewModel { 
    public Person Person { get; set; } 
    public Address Address { get; set; } 
} 

또는 같은를 :

public PersonAddressViewModel { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string StreetName { get; set; } 
    // ...etc 
} 

제게는 우리가하려고하는 것에 대해 더 정확하게 생각합니다. 우리가 더 미세한 그레인 폼 (아마도 우리가 캡처 한 것은 FirstName, LastName, StreetAddress 모두)을 수행했다면 그 레벨로 내려가는 것이 더 합리적 일 것입니다. 하지만, 우리는 모든 Person 데이터를 폼과 ALL Address 데이터로 캡쳐하고 있기 때문에 첫 번째가 정확하다고 느낍니다. 그것은 그런 것들을 분리하는 것이 의미가없는 것처럼 보입니다 (그리고 많은 추가 작업).

통찰력을 높이세요.

+0

asp.net, MVVM 실버 라이트와 같은 기술에 사용되는 그리고 WPF, 그리고 Knockout.js와 같은 클라이언트 측 기술에도 사용할 수 있지만 asp.net MVC 자체는 mvvm을 사용하지 않습니다. mvvm과 뷰 모델을 혼동하지 마십시오. –

+0

@MystereMan - 알았습니다. 내 실수. (필자의 독서에 따르면, 많은 사람들이 똑같은 실수를 저지르고있는 것처럼 보입니다.) 내가 실수를했기 때문에 - ASP.NET이 MVVM 패턴을 활용할 수없는 이유에 대한 기사를 가르쳐 주시겠습니까? 프레임 워크의 디자인에서 상속받는 것이 있습니까? 고맙습니다. – JasCav

+0

MVVM은 매우 구체적인 패턴입니다. MVC가 MVVM을 "활용"할 수 없다는 것은 아닙니다. MVVM은 상호 배타적입니다. MVVM에는 컨트롤러가없고 MVC가 있습니다. (이것이 유일한 차이점은 아니지만 상호 배타적 인 큰 차이입니다). 그들은 단지 두 개의 다른 인터페이스 패턴입니다. 차이점에 대한 좋은 기사가 있습니다. http://russelleast.wordpress.com/2008/08/09/overview-of-the-modelview-viewmodel-mvvm-pattern-and-data-binding/ –

답변

2

Person 개체의 모든 필드를 사용하는 경우 복잡한보기 모델을 사용할 때 아무 문제가 없습니다. 그러나 여기 또는 그저 필드를 사용하는 경우에는 사용중인 값만 사용하여 뷰 모델을 작성하는 것이 좋습니다.

당신이 원하는대로 당신의 뷰 모델을 만들 수 있습니다 만, 뷰 모델은 그것이 나타내는 뷰에 맞게 커스터마이징되어야한다는 것이 중요합니다.

개체가 비슷한 정의를 가져야하므로 AutoMapper를 사용하여 비즈니스 또는 도메인 모델에 매핑하는 경우 첫 번째 방법을 사용하는 것이 훨씬 쉽습니다.

-1

양식을 렌더링 할 때 해당 뷰 모델을 사용하는 경우 양식에 필요한 모든보기 데이터를 결합하므로 두 번째 방법을 사용하십시오.

0

MVVM을 사용하고 있지 않습니다. Model 클래스를 깨뜨리는 것을 피하기 위해보기 전용으로 ViewModel, 클래스를 정의하고 있습니다. 이 경우 최상의 이익을 위해 원하는 속성을 정의 할 수 있습니다. 이 예에서 나는 두 번째 해결책을 찾으러 갈 것이지만 그것은 당신에게 달린 것입니다.

저는 많은 개발자 제공 업체와 함께 큰 프로젝트를 진행하고 있습니다. 이 경우 고객은 자신이 우려하는 모델 (비즈니스 엔티티가 호출 할 때)을 유지하려는 ViewModel을 정의하게했습니다. 우리는 다른 그룹이므로 아무도 다른 ViewModels에 대해 걱정하지 않으므로 다른보기가 첫 번째보기와 조금 다를지라도 한보기에 대해 하나의 클래스를 사용할 수도 있습니다. 이는 순수 모델 대신 ViewModels의 장점 중 하나입니다.

데이터 바인딩을 위해 JSON 오브젝트를 통해 클라이언트 측에서 ViewModel을 정의하는 것을 선호합니다. 이걸 사용하면 knockoutjs, angularjs, backbonejs 등을 통해 MVVM을 사용할 수 있습니다.

MVVM 검사 knockoutjs를 사용하려는 경우. 매우 쉽고 즐겁습니다.

0

ViewModel 클래스의 Model 클래스를 직접 사용하거나 (첫 번째 예제처럼) 래핑하면 ViewModel 클래스에 민감한 속성이있을 때 잠재적 인 보안 문제가 발생할 수 있습니다.User 클래스의 IsAdmin).

는 컨트롤러 액션이 PersonAddressViewModel 입력 매개 변수를 말 : 당신의 UI는 capabilitiy를 제공하지 않는 경우에도

public ViewResult someAction(PersonAddressViewModel personAddress) 
{ 
    //save it 
} 

악의적 인 사용자가 기본적 PersonAddressViewModel 복합 객체의 모든 속성을 설정할 수 있습니다. 이것은 MVC의 기본 바인딩 메커니즘으로 가능합니다. 이를 방지하려면, 하나 민감한 모델 클래스를 포장하지 않거나 여기에 Bind attribute

이상을 사용 : Pro ASP.NET MVC 3 Framework 3rd Edition By Steven Sanderson , Adam Freeman (17 장)

는 MVC가 MVVM을 사용하지 않는
관련 문제