在用户控件上设置私有字段可防止更改“可见”

时间:2013-07-01 15:10:07

标签: c# asp.net

在一个页面中,我有一个事件处理程序,在一个控件上将'Visible'设置为false,而在另一个控件上设置为true。逐步调试,我看到这些值设置正确,并且标记为可见的控件通过OnPreRender,而我设置为不可见的控件则没有。所以这一切似乎都按预期工作。但是,当请求完成时,页面上的可见性根本没有改变。我已经尝试将直接父UpdatePanel设置为“always”并尝试手动调用它上面的“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
    };
}

1 个答案:

答案 0 :(得分:0)

我终于通过查看实际的反应机构找到了原因。

156 |错误| 500 |错误序列化值'版主类名称'类型'保留类名' |

为什么调试中没有抛出这个错误超出了我的意思,但是对于其他读这个问题寻找答案的人来说,看看你的回复机构!这是因为我试图将我的类实例放入Viewstate,但该类没有标记Serializable属性。