2011-01-27 8 views
0

확인 다른 바보 Q의 시간이 필요합니다.컨트롤의 속성 유지

ViewState에서 유지해야하는 몇 가지 속성이있는 컨트롤이 있습니다. 컨트롤이 페이지에 두 번 이상 나타나면 속성을 덮어 쓰지 않도록해야합니다.

나는

ViewState[String.Format("{0}_{1}", "BaseKey", this.ClientID)] = ... 

... 같은 것을 쓸 생각하지만 된 ClientID의 값은 페이지의 라이프 사이클 도중에 변경합니다. 그것은 "MyControl1"과 같은 것으로 시작하여 "ctl001_MyControl1"이됩니다. 따라서 변경되기 전에 적용된 값은 모두 손실됩니다.

대신 고유 ID를 사용하면 동일한 문제가 발생합니다.

나는 명백한 것을 놓치고있는 것을 알고 있으며, 나는 복용하지 않는 약을 비난하려고합니다. 그래서 나는 보지 않습니다. 벙어리입니다.

- 스튜어트는

답변

2

그게 사실 인 경우, 사용자 정의 컨트롤 내에서이 일을하는 고유 한을 할 필요가 없습니다 것 같습니다 각 컨트롤의 각 인스턴스는 자신의 viewstate를 관리하므로 필요한 모든 권한은 다음과 같이 사용자가 제어 할 수있는 키입니다.

ViewState[@"somekey"] = ... 
+0

참조; 나는 * 내가 뭔가를 놓쳤다 고 말했다! :-) –

1

Page_PreRender보다는를 Page_Load에 그 일을 시도?

+0

Hmm. 하지만 컨트롤을 사용하는 개발자가 페이지의 마크에서 이러한 속성 중 하나를 설정하면 내가 잃어버린 것입니다. –

+0

마크 업의 값은 ID가 변경되기 전에 * 설정되어있는 것으로 보입니다. –

1

relative라는 값을 컨트롤 자체의 출력 이름에 저장하지 마십시오. 고유하고 변경되지 않는 이름을 제공 한 다음 모든 바인딩 규칙이 클라이언트 이름 대신 해당 이름으로 조정되는지 확인하십시오.

편집 : 무슨 뜻인지의 작은 예를 들어
:

MyControl ctrl1 = new MyControl(); 
ctrl1.ID = "MyControlA"; 
ctrl1.Text = "Some text"; 
ViewState[ctrl1.ID] = ctrl1.Text; 

MyControl ctrl2 = new MyControl(); 
ctrl2.ID = "MyControlB"; 
ctrl2.Text = "Some other text"; 
ViewState[ctrl2.ID] = ctrl2.Text; 
+0

하지만 사용했던 고유 한 값을 유지해야하며 고유 한 값을 저장하는 데 사용하는 지속성 키를 만들어야합니다. –

+0

@Stuart Hemming - 내가 따를지는 잘 모르겠습니다. 이 변수를'Steve'라고 부르면 항상'Steve'가됩니다. 그것은 ViewState에 저장되며 절대 변경되지 않습니다. 뒤에있는 코드에서 클라이언트의 ID와는 아무런 관련이없는 고유 한 식별자가 있습니다. 코드 뒤에 동적으로 ID를 생성하는 경우에도 id가 있습니다. 이 ID를 사용하여 가죽을 구부릴 수 있다면 clientID 문자열을 '_'으로 분할하고 최종 색인을 ID로 사용하여 항상 깨뜨릴 수 있습니다. –

+0

나는 분명히 여기에서 정말로 흐릿 해지고있다. MyControl - MyControlA 및 MyControlB의 인스턴스가 2 개 있고 viewstate에 저장하는 "Steve"라는 속성이있는 경우 MyControlA.Steve (viewstate의 "Steve"로 유지됨)에 쓰려고 시도하지 않습니다. 이전에 MyControlB.Steve (동일한 코드를 사용하여 viewstate에서 "Steve"로 유지됨)에 대해 이전에 저장 한 값을 혼란에 빠뜨린 경우? MyControlA 및 MyControlB에 대한 고유 키를 만들면 나중에 * 얻을 수 있도록 해당 값을 유지해야합니다. 내가하지 않니? –

관련 문제