2010-08-06 5 views
10

렌더링 할 뷰의 데이터를 포함하기 위해 ViewModel을 사용하도록 컨트롤러를 개발하려고한다고 가정하면 모두 데이터가 ViewModel에 포함되어야합니까? ViewModel을 우회하는 조건은 무엇입니까?ViewModels 대신 ViewData를 사용하는 것이 언제 올바른가요?

내가 묻는 이유는 코드의 일부가 ViewData를 사용하고 일부가 ViewModel을 사용하고 있기 때문입니다. 팀에서 바로 ViewData를 사용할 때와 바로 가기를 사용할 때 가이드 라인을 배포하고 싶습니다. 이 문제를 다루는 다른 개발자의 의견을 듣고 싶습니다. 그래야 제 가이드 라인이 제가 편견을 느끼는 것이 아니라는 것을 알고 있습니다.

답변

9

Fabian의 덧글을 추가하십시오. this article에 설명 된 단계에 따라 뷰 데이터를 사용하지 않도록 명시 적으로 지정할 수 있습니다. 모든 것을 모델로 사용하려면 이 아니라 실제로는이 아닙니다. 당신을 ViewData를 사용할 수 밖에 없다 경우

(기존 프로젝트에 대해 말하기); 최소한 문자열 상수를 사용하여 '마법 문자열'사용을 피하기 위해 이름을 확인하십시오. 뭔가 따라와 : ViewData[ViewDataKeys.MyKey] = myvalue; Infact, 나는 "문자열 기반"(세션 키, 캐시 키, VaryByCustom 출력 캐시 키 등)해야 할 모든 것에 대해 이것을 사용합니다.

+4

+1 - 우리는 항상 여기에 stongly 유형의 뷰 모델을 사용하지만 additonal 'trim'의 작은 비트에는 viewdata를 사용합니다. 이것은 대개 다양한 장소에서 재사용되는 부분 뷰에서만 발생합니다. –

+1

@jim : 동의합니다. 피할 수없는 경우 (공유 된 부분보기와 같은) 시나리오가 있습니다. ViewData를 사용하여 폴백해야하는 경우 다리에서 스스로를 방지하기위한 조치를 취하는 것이 가장 좋습니다. – DanP

+0

문자열 상수와 마법 문자열은 무엇을 의미하며 공유 부분 뷰에서 ViewData를 사용하는 것은 어쩔 수없는 이유는 무엇입니까? – Howiecamp

2

필자는 개인적으로 ViewData를 사용하지 않으며, 무엇인가 테스트하는 경우를 제외하고는 모든 것이 모델을 거치며보기에 값을 빨리 볼 수 있어야합니다. 강력한 타이핑!

+0

전적으로 동의합니다. 매직 문자열은 추악하고, 최악의 문제가 있습니다. 즉, 나는 또한 ViewData를 사용하여 신속하게 물건을 테스트하지만 문제는 그것이 영구적 인 해결책으로 끝나는 때입니다! – DaveDev

+0

예 - 100 % 동의합니다. 심지어 더 이상 사용하지 않을 수도 있습니다. –

+1

@ Pure.Krome : 당신은 확실히 내 게시물에 설명 된 방법을 사용하여 감가 상각을 에뮬레이션 할 수 있습니다. 기본 컨트롤러에서 viewdata 속성을 무시하고 [Obsolete()] 특성을 추가하면 동일한 결과가 나타납니다 (근본적으로). – DanP

1

ASP.NET MVC 2의 관점에서, 뷰 모델 패턴이 바람직한 접근 방법이다. 이 접근법은 컴파일 타임 정적 유형 검사를 최대한 활용합니다. 이것은 compiling mvc views와 결합하여 런타임과 달리 빌드/컴파일 시간 동안 오류가 감지되므로 개발 작업 흐름을 훨씬 빠르고 생산적으로 만듭니다.

3

보기가 복잡해질수록 입력 필드에 대한 모델 사용을 예약하고 ViewData를 사용하여 View에서 렌더링해야하는 다른 것을 지원할 수 있습니다.

인수의 적어도 부부가이 기능을 지원하는이 있습니다

  1. 당신은 존재하는 일부 데이터를 필요로하는 마스터 페이지를 (예를 들어, 헤더의 StackOverflow의 사용자 정보 같은). 사이트 차원의 ActionFilter를 적용하면 모든 작업 후에 ViewData에서이 정보를 쉽게 채울 수 있습니다. 이를 모델에 넣으려면 사이트의 다른 모든 모델이 기본 모델을 상속해야합니다 (초기에는 좋지 않지만 시간이 많이 걸릴 수 있습니다).

  2. 게시 된 양식의 유효성을 검사 할 때 유효성 검사 오류가있는 경우 유효하지 않은 필드가있는 모델을 다시보기에 다시 바인딩하고 유효성 검사 메시지를 표시하려고 할 것입니다. 입력 필드의 데이터가 다시 게시되고 모델에 바인딩되므로 괜찮 으면서도 뷰에서 다시 채워야하는 다른 데이터는 어떻게됩니까? (예 : 드롭 다운 목록 값, 정보 메시지 등) 게시되지 않으며 게시 된 입력 값의 "주변"모델로 다시 채우는 것이 지저분해질 수 있습니다. 뷰 데이터를 ..view 데이터로 채우는 메소드를 사용하는 것이 더 간단합니다.

내 경험에 비추어 볼 때이 접근 방식은 잘 작동합니다.

그리고 MVC3에서 dynamic ViewModels은 더 이상 문자열 인덱싱을 의미하지 않습니다!

관련 문제