2012-06-20 4 views
0

나는 항상 MVC 응용 프로그램을 개발 중이다.왜 내 viewmodel 속성이 null 또는 0이됩니까?

저는이 시점에서 내 도메인 객체와 동일한 viewmodel을가집니다. 내 컨트롤러가 뷰 모델을 빌드하고 뷰에 전달합니다. 사용자가 기본 키 및/또는 외래 키를 표시하지 않기 때문에보기에는 일부 속성 만 표시됩니다. 기본 키의 경우 데이터베이스를 업데이트/삭제하려면 데이터가 있어야합니다.

뷰에서 viewmodel 속성을 사용하지 않으면 ViewModel을 다시 전달할 때 기본값 (숫자 값 유형의 경우 0, 참조 유형의 경우 null)으로 설정됩니다. 이것은 올바른 행동입니까?

편집보기에 전달 된 viewmodel에 (예상했던대로) 모든 속성이 포함되어 있음을 확인했습니다.

질문 - 일단 뷰가 렌더링되면 뷰 모델은 어떻게됩니까? 내 뷰 모델에 뷰에서 사용되지 않는 속성이 포함되어 있으면 해당 값이 사라지나요? 예를 들어 컨트롤러에서 Edit 액션을 실행하기 위해 Edit action 링크를 클릭하면 액션에 전달 된 ViewModel은 화면에 표시되지 않는 한 속성을 포함하지 않습니다. 왜?

여기는 ASP.NET MVC 4 RC입니다.

답변

6

I 뷰의 뷰 모델 속성을 사용하지 않는 I 다시 뷰 모델을 전달할 때, ( 기준 유형의 수치 타입 0, NULL) 기본값으로 설정 인 것으로 보인다. 올바른 이 맞습니까?

예, 컨트롤러 동작을 호출 할 때 요청에 바인딩하려는 모든 속성을 전달해야합니다. 예를 들어, html <form>을 사용하여 입력 필드를 사용해야하는 경우를 예로들 수 있습니다. 숨겨진 필드를 사용할 수는 있지만 표시해야합니다. 그렇지 않으면 컨트롤러 액션에 아무 것도 보내지 않습니다.

질문 - 뷰가 렌더링되면 뷰 모델은 어떻게됩니까?

범위를 벗어나 가비지 수집 대상입니다.

내 viewmodel에보기에 사용되지 않는 속성이 포함 된 경우 해당 값이 사라지나요?

물론입니다. 그러나 뷰 내부에서 이러한 속성을 사용하더라도 사라집니다. 예를 들어,보기 내에서만 값을 표시하지만 양식을 제출할 때 입력 필드를 사용하여 서 v로 다시 보내지 않으면 해당 필드도 사라집니다. 내가 컨트롤러의 편집 작업을 을 발사 편집 actionlink, 그들은 화면에 표시하지 않는 한 어떤 속성을 포함하지 않는 경우의 조치에 전달되는 뷰 모델을 클릭 예를 들어

. 왜?

뷰 모델이 더 이상 존재하지 않기 때문에. 사라지고 가비지 수집. 그것이 HTTP 프로토콜이 작동하는 방식입니다. 그것은 무국적자입니다. 요청 간에는 아무 것도 없습니다.액션 링크 나 기타를 사용하는 경우 POST 양식 값 또는 쿼리 문자열 매개 변수로 요청에 채우려는 모든 속성을 포함해야합니다.

사용자가 뷰 내부에서 값을 수정하지 않아도된다면 컨트롤러 액션에 ID를 전달하면이 컨트롤러 액션이 저장되어있는 곳 (데이터베이스 등)에서 모델을 검색 할 수 있습니다. 이 ID를 사용합니다.

0

속성이 양식 내에 input HTML element을 생성하는 도우미 메서드에있는 경우 양식을 제출할 때 HTTPost 동작 방법으로 사용할 수 있습니다. 단순히 div/span에 표시하는 경우에는 속성 값을 가져 오지 않습니다. 이것이 MVC 모델 바인딩이 작동하는 방식입니다. 이러한 HTML 헬퍼

@Html.TextBoxFor 

@Html.DropDownFor 

@Html.EditorFor 

@Html.HiddenFor 

를 사용하는 경우 당신은 내가 (m => m @ Html.TextBoxFor 사용이

@Html.DisplayFor 
+0

를 사용하는 경우

은 그나마 값을 기대하여 HttpPOST 행동의 값을 기대합니다. FirstName) 및 @ Html.TextBoxFor (m => m.LastName)이지만 둘 다 submit시 null로 돌아옵니다. 그리고 그들은 아름답게 데이터베이스의 데이터로 채워집니다. 예를 들어, 이름 텍스트 상자는 "John"을 표시하고 성 텍스트 상자는 "Doe"를 표시합니다. 제출시 이러한 값을 얻지 못하는 이유는 무엇입니까? 그들은 null입니다. 흥미롭게도 숨겨진 필드는 @Html.HiddenFor (m => m.EmployeeId)가 미리 채워진 값으로 돌아 오는 것으로 선언되었습니다. – Stack0verflow

관련 문제