지난 주에 저는 "컨트롤 ViewState 속성의 값은 어디에 저장되어 있습니까?"라는 기사를 썼습니다. 여기서는 Control.ViewState가 궁극적으로 Control.SaveViewState 및 Control.LoadViewState라는 두 가지 메서드를 통해 액세스된다고 설명했습니다. 기사에는 혼란스러울 수 있는 문장이 있습니다. "OnInit 이후에 this.ViewState[key]를 사용하여 읽고 쓸 때 이 속성은 true입니다." 여기서 "이 속성"은 StateItem.IsDirty를 나타냅니다. OnInit 후에 IsDirty 속성이 항상 true인 이유는 무엇입니까? TRULY ViewState 이해를 참조한 후, 그것이 항상 사실이 아니라는 것을 마침내 이해했습니다. 자세한 이유를 설명하십시오.
가장 먼저 살펴보아야 할 것은 StateBag.TrackViewState 메서드입니다. 이 메서드는 OnInit 컨트롤이 호출될 때 StateBag가 StateItem의 변경 사항을 추적하기 시작하도록 하는 것입니다. . 즉, OnInit 이전에는 IsDirty 속성이 false이므로 Value 속성 값을 어떻게 설정하더라도 IsDirty 속성은 변경되지 않습니다. OnInit 이후에는 Value 속성 값을 처음 변경할 때까지 IsDirty 속성도 false로 유지됩니다(this.ViewState[key] 메서드를 통한 변경 참조). SaveViewState 단계에서는 IsDirty 속성이 true인 StateItem만 저장됩니다.
왜 이렇게 설계되었나요? 예를 들어 선언적으로 정의된 Label의 Text 속성에는 ASPX의 초기 값이 할당되고, 초기 값은 ViewState["Text"]를 통해 자연스럽게 유지됩니다. 다음 페이지 수명 주기에서 먼저 이 Label의 Text 속성은 OnInit 중에 ASPX에 선언적으로 정의된 초기 값을 로드한 다음 LoadViewState 동안 ViewState에서 읽은 ViewState["Text"]로 덮어씁니다. 그러나 이전 페이지 수명 주기에서 프로그래밍 방식으로 Text 속성을 변경하지 않는 한 ViewState["Text"]는 여전히 초기 값이므로 ViewState["Text"]를 사용하여 초기 값을 저장하여 선언적으로 정의된 초기 값을 덮어씁니다. 이런 식으로 동일한 값을 덮어쓰는 것은 전혀 의미가 없으며 ViewState 공간도 낭비합니다. 이러한 자원 낭비 문제를 해결하기 위해서는 선언적 정의 이후 변경되지 않은 모든 값은 ViewState를 사용하여 지속되어서는 안 되며, 자세한 구현은 위에서 언급한 TrackViewState 메커니즘입니다.
Control.ViewState에 대해 설명했습니다. 컨트롤 디자이너라면 다음과 같은 방법으로 ViewState에 컨트롤 속성을 안전하게 저장할 수 있습니다.
공개 문자열 텍스트
{
{return this.ViewState["Text"]를 문자열로 반환합니다.}
{this.ViewState["Text"] = 값;}을 설정합니다.
}
내부 메커니즘은 저장한 값이 ASPX에 선언적으로 정의된 초기 값인지 구별한 다음 해당 값을 유지할지 여부를 결정하는 방법을 알고 있습니다. 동시에 ViewState 값이 어떤 단계에서든 지속되는지 여부에 대한 결정을 변경하려면 기본적으로 모든 컨트롤 개발자의 요구를 충족하는 ViewState.SetItemDirty(key, dirty)를 통해 이를 변경할 수 있습니다.
http://www.cnblogs.com/cathsfz/archive/2006/10/29/543695.html