0

好的,是时候从你那里得到另一个愚蠢的 Q 了。

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

我想写一些类似...

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

但是 ClientID 的值在页面的生命周期中会发生变化。它一开始就像“MyControl1”,然后变成“ctl001_MyControl1”。因此,在更改之前应用的任何值都会丢失。

如果我改用 UniqueID,也会发生同样的事情。

我知道我遗漏了一些明显的东西,我会责怪我正在服用的药片,所以我看起来不会太笨

——斯图尔特

4

3 回答 3

2

看起来您正在用户控件中执行此操作,如果是这样,您不需要为视图状态创建唯一键,每个控件的每个实例都管理它自己的视图状态,因此您只需要一个控件已知的键,类似的东西:

ViewState[@"somekey"] = ...
于 2011-01-27T13:33:07.503 回答
1

尝试在 Page_PreRender 而不是 Page_Load 上执行它?

于 2011-01-27T12:44:10.290 回答
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; 
于 2011-01-27T12:44:25.130 回答