在用户控件上设置私有字段可防止更改';可见';停止工作

本文关键字:停止工作 可见 可防止 字段 控件 用户 设置 | 更新日期: 2023-09-27 18:20:31

在一个页面中,我有一个事件处理程序,它在一个控件上将"Visible"设置为false,在另一个控件中将"true"设置为true。通过调试,我看到这些值得到了正确设置,标记为可见的控件通过了OnPreRender,而我设置为不可见的控件则没有。因此,所有这些似乎都如预期的那样起作用。但是,当请求完成时,页面上的可见性根本没有改变。我曾尝试将直接父UpdatePanel设置为"始终",并尝试对其手动调用"Update()",但没有效果。有关于这里发生了什么的线索吗?

更新:

我发现,只是在我的用户控件上设置了一个私有属性,才导致整个事情无法运行。我已经包括了一个控制的例子,以及它引用私人领域的所有地方。

示例:

protected override void OnLoad(EventArgs e)
{
    if (this.IsPostback)
    {
        return;
    }
    this.Control1.Visible = true;
    this.Control2.Visible = false;
}
protected void OnButtonClicked (object sender, EventArgs e)
{
    this.Control1.Visible = false;
    this.Control2.Visible = true;
    // this has desired results when it fires
}
protected void OnUserControlEventThatFiresAfterRowCommand (object sender, EventArgs e)
{
    this.Control2.SomeProp = this.GetSomeObject();
    this.Control1.Visible = false;
    this.Control2.Visible = true;
    // this does not have desired results, even though it does fire
}

然后在Control2:中

private SomeClass privatefield;
public SomeClass SomeProp
{
    get
    {
        return this.privatefield;
    }
    set
    {
        this.PopulateFields(value);
        this.privatefield = value;
        // If I comment out this line it works!
    }
}
protected override void LoadViewState(object savedState)
{
    object[] state = savedState as object[];
    base.LoadViewState(state[0]);
    this.Enabled = state[1] as bool? ?? true;
    this.SomeProp = state[2] as SomeClass;
    this.Visible = state[3] as bool? ?? true;
}
protected override object SaveViewState()
{
    return new object[]
    {
        base.SaveViewState(),
        this.Enabled,
        this.SomeProp,
        this.Visible
    };
}

在用户控件上设置私有字段可防止更改';可见';停止工作

通过查看实际的响应主体,我终于找到了原因。

156 |错误|500 |序列化类型为"保留类名"的值"保留的类名"时出错|

为什么这个错误没有在调试中抛出我无法理解,但对于其他阅读这个问题寻找答案的人来说,请查看您的响应体!这是因为我试图将类的实例放入Viewstate,但该类没有用Serializable属性标记。