2010-07-04 3 views
0

매우 자주 복잡한 데이터를 다른 뷰 (다른 데이터베이스 개체, 클래스 등)에 전달해야합니다. 수십 개의 클래스 헬퍼를 만드는 데 지쳐있었습니다.보기에 데이터 전달하기 (ASP.NET MVC)

class StatsPageViewData 
{ 
    public User User { get; set; } 
    public Something Something { get; set } 
    // blah blah 
} 

당연히 나는 ViewData [ "무언가"]를 사용할 수 없다.

제 질문은, 어떻게 든이 프로세스를 더 쉽게 만들 수있는 방법이 있습니까?

답변

1

보기 모델은 거의 도메인 클래스 모음이 아니어야합니다. 우선, 도메인 클래스를 뷰 모델에 넣는 것이 큰 주제입니다. 많은 사람들은 당신이 그렇게해서는 안된다고 생각합니다. 보기에는 전체 User 인스턴스가 필요하지는 않지만 이름 만 필요합니다. 전체 User 인스턴스를 뷰 모델에 보관하면 실제 뷰 모델 의도를 숨기고 재사용하기가 어려워집니다. 은 뷰에서 사용자 속성에 액세스하여 형식을 지정하는 대신 이름을 올바르게 지정하는 문자열 UserName 속성을 사용하는 것이 좋습니다.

그 이론은 아무도 없습니다. 입니다. 그러나 기억을 유지하고 성취하려고 노력하는 것이 좋습니다.

둘째,보기 모델은 유효성 검사 특성 및 추가 프레젠테이션 논리와 같은보기 의미 체계를 제공해야하기 때문에 도메인 클래스 모음이 아니어야합니다. 선택 목록의 데이터, 형식 지정 등을 제공하는 집계 속성을 가질 수 있습니다. 또 다른 예를 들어, POST 뷰 모델에는 원시 양식 데이터를 엔티티로 변환하는 메소드가있을 수 있습니다.

일부 프리젠 테이션 로직을보기 및/또는 컨트롤러에서보기 모델로 이동해야합니다. 서식,보기에서만 필요한 속성 등입니다. 컨트롤러는 엔터티 컬렉션을 뷰 모델 데이터 컬렉션으로 변환하면 안됩니다. 뷰 모델이이를 수행해야합니다. 보기는 형식 사용자를 단일 이름 및 주소 문자열 -보기 모델로 변환하면 안됩니다.

이렇게하면 더 이상 바보가 아니며 작업이 덤프 및/또는 반복적이지 않으므로 "보기 모델"클래스를 만드는 것에 질려가 없습니다. 뷰 모델 클래스는 애플리케이션의 다른 클래스만큼 중요합니다.

+0

나는 당신이 말한 모든 것에 동의합니다. 그러나 정수 배열과 같은 것들을 전달해야 할 때가 있습니다. ViewData를 사용하는 것은 매우 어색합니다.여기에 추상화 레이어가 필요하지 않습니다. – Alex

+1

현재 프로젝트에서 150 개의 뷰가 있는데 때때로 하나의 객체 (배열, 엔티티 등)를 전달하지만 때때로 뷰가 복잡해지면 항상 뷰 모델을 만들고 아무 문제가 없습니다. 이것은 "모범 사례"는 아니지만 선과 단순의 균형이 잘 맞습니다. 보기에 많은 "클라이언트"가있는 경우 항상보기 모델을 먼저 만듭니다. 뷰가 엔터티에서 문자열 자체에 너무 많은 형식을 지정해야하는 경우 뷰 모델을 만듭니다. 나는 거의 속성이 아닌 뷰 모델을 거의 가지고 있지 않습니다. – queen3

1

이러한 도우미 클래스를 만드는 데 도움이되는 ReSharper과 같은 플러그인을 사용하십시오.

클래스와 속성을 사용하여 시작하십시오. 이렇게하면 편집기에서 누락 된 것으로 표시되므로 플러그인을 사용하여 클래스와 속성을 만들 수 있으므로 다른 방법보다 훨씬 빠르게 도우미 클래스를 만들 수 있습니다.

0

ViewModelBase로 시작하고 필요한 경우 확장하십시오.

1

나는 모델 당 뷰 패턴이 최선의 방법이라고 생각한다. 가능한 경우 모델 구성 요소를 공유하기 위해 상속 및 구성을 사용하려고 시도 할 수 있지만 (코드 DRY 유지), 그만큼의 성공 만이 있었을뿐입니다. 보기 모델에서 비즈니스 모델로 쉽게 변환하려면 AutoMapper을 시도해보십시오. 나는 그것을 적용하는 것에서 이익을 얻을 수있는 유일한 거대한 프로젝트에 너무 멀기는하지만, 프로세스를 완화시키려는 것이 나의 레이더에있다.

+0

간단한 규칙을 사용하면 AutoMapper 사용을 크게 단순화 할 수 있습니다. 예 : 부트 스트랩 코드를 통해 시작할 때 호출되는 정적 GetAutoMap() 메소드를 통해 매핑을 제공하도록 뷰 모델을 만듭니다. – queen3

+0

+1, 더 이상 동의 할 수 없습니다. –

관련 문제