【问题标题】:Persisting a control's properties保持控件的属性
【发布时间】:2011-01-27 12:41:44
【问题描述】:

OK 是时候再来一个你的愚蠢 Q 了。

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

我想写一些类似...的东西

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

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

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

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

-- 斯图尔特

【问题讨论】:

    标签: c# asp.net viewstate object-persistence


    【解决方案1】:

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

    ViewState[@"somekey"] = ...
    

    【讨论】:

    • 见;我我错过了什么! :-)
    【解决方案2】:

    尝试在 Page_PreRender 而不是 Page_Load 上执行此操作?

    【讨论】:

    • 嗯。但是,如果使用该控件的开发人员在页面标记中设置了这些属性中的任何一个,我就会丢失它们。
    • 似乎标记中的值是在 ID 更改之前设置的
    【解决方案3】:

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

    编辑:
    作为我的意思的一个小例子:

    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; 
    

    【讨论】:

    • 但是我需要保留我使用过的唯一值,并且我需要使我用来保存该值的持久性密钥唯一并且...
    • @Stuart Hemming - 我不确定我是否跟随。如果您将此变量称为Steve,那么它始终是Steve。它被放入 ViewState 并且永远不会改变。在您的代码后面的某个时刻,它有一个与客户端 ID 无关的唯一标识符。即使您在其背后的代码中为它动态生成一个 id,它也有一个 id。如果您真的很想使用该 ID,您可以随时将 clientID 字符串拆分为 _,并将最终索引用作您的 ID。
    • 我显然在这里真的很昏暗。如果我有 2 个 MyControl 实例 - MyControlA 和 MyControlB 并且我有一个名为“Steve”的属性,我将其保存到视图状态,那么不会尝试写入 MyControlA.Steve(在视图状态中保留为“Steve”)去与之前为 MyControlB.Steve 保存的值混淆(在视图状态中也保留为“Steve”,使用相同的代码)?如果我为 MyControlA 和 MyControlB 创建一个唯一键,我需要将 that 值保存在某个地方,以便稍后获取。不是吗?
    • @Stuart Hemming - 正是。您将拥有 MyControlA 和 MyControlB,但这将由背后代码中的 ID(希望如此)而不是 ClientID(可更改)确定。因此,在您实例化控件时的代码中,您将直接使用某些控件特定值(如 MyControlA)设置其 ID,这将成为视图状态中的键。在 for 循环中添加的动态控件会出现与该唯一性相关的不同问题,但听起来不像您正在这样做。
    • @Stuart Hemming - 添加了一个脏代码 sn-p 来描述我的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多