2011-01-27 43 views
0

好吧,真正为你的另一个愚蠢的Q的时间。坚持一个控件的属性

我有一个控件,有一些属性需要在ViewState中保存。如果控件在页面上出现多次,我还需要确保属性不会被覆盖。

我觉得写东西像...

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

但客户端ID的值在页面的生命周期变化的中途。它从“MyControl1”开始,然后变成“ctl001_MyControl1”。所以在更改之前应用的任何值都会丢失。

如果我使用UniqueID,则会发生同样的情况。

我知道我错过了一些明显的东西,我要去责怪我服用的药片,所以我也不看愚蠢。

- 斯图尔特

回答

2

它看起来像你这样做的用户控件中,如果这是真的,你不需要做出独特视图状态的关键,每个控件的每个实例管理它自己的视图状态,所以你需要的是你的控件已知的一个关键,类似这样的:

ViewState[@"somekey"] = ... 
1

尝试做它Page_PreRender而不是Page_Load中?

+0

嗯。但是如果使用控件的开发人员在页面标记中设置了这些属性中的任何一个,我就会失去它们。 – 2011-01-27 12:48:02

+0

看起来标记的值是在ID改变之前设置的。 – 2011-01-27 12:48:39

1

不要存储名称相对于控件本身的输出名称的值。为其提供一个唯一的,不变的名称,然后确保所有绑定规则都适合该名称而不是客户名称。

编辑:
由于我是什么意思一个小例子:

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

但是,然后我需要坚持我使用的独特的价值,我需要使用持久性键来保存该值独特和... – 2011-01-27 12:46:20