【问题标题】:Viewstate of ascx lost between postbacksascx 的视图状态在回发之间丢失
【发布时间】:2009-11-20 13:16:42
【问题描述】:

在我的 ASP.NET 应用程序中,我使用 LoadControl 动态加载 .ascx,使用以下模式:

var ctrl = LoadControl("/path/to/control.ascx");
((ControlType)ctrl).SomeProperty = someData;
placeholder.Controls.Add(ctrl);

我添加的控件将 SomeProperty 属性值直接保存到 ViewState 中,如下:

public int? SomeProperty
{
    get { return (int?)ViewState["SomeProperty"]; }
    set { ViewState["SomeProperty"] = value; }
}

在那之后,ascx 控件就自己过着自己的生活,一切都很好,直到回发发生。当页面回传时,突然视图状态为空!我怀疑发生这种情况是因为我在将实例化的 ascx 添加到页面之前操纵了 ViewState。另外,我可以通过在我的 ascx 控件的Page_Load() 方法中添加以下行来防止 ViewState 丢失:

SomeProperty = SomeProperty;

我必须为每个属性执行上述操作,以确保保留 ViewState。现在,有没有更漂亮的方法来做到这一点?在将实例化的 .ascx 添加到页面后操作 ViewState 不是一个选项 - 我需要 Page_Init()Page_Load() 方法中的 ViewState 的内容,它们在我将 .ascx 添加到我的页面时触发.

谢谢。

【问题讨论】:

  • 我曾经遇到过类似的问题,在我的情况下,问题是在我们所有的基础页面中,我们将所有控件设置为不使用视图状态。我的观点是,动态添加控件可能不一定是问题,但隐藏的地方 viewstate 设置为禁用。

标签: asp.net viewstate


【解决方案1】:

看看ASP.NET Page Life CycleUnderstanding View State。视图状态在初始化后被加载,因此您将无法在 Page_Init 中访问它。最好使用隐藏字段。

如果您对使用视图状态一无所知,那么您最早可以通过覆盖LoadViewState 方法(尽管在尝试访问它之前请记住调用base.LoadViewState)。

【讨论】:

  • 谢谢,解决了。不过,我现在处于两难境地:我需要在 Page_Init 中创建一些控件,具体取决于视图状态的内容(或隐藏字段,就此而言,它似乎也没有在 Page_Init 中加载)。
  • 哦,如果您使用 Hidden Field 方法,您将需要查看 Request.Forms 的值。实际的服务器控件尚未加载。试试看。
  • 哦,太好了。不错的黑客:)。非常感谢。
【解决方案2】:

您还需要在设置属性之前将控件添加到控件集合中。 ViewState 在添加到控件集合之前不会被记录。

placeholder.Controls.Add(ctrl); 
((ControlType)ctrl).SomeProperty = someData; 

【讨论】:

    【解决方案3】:

    在回发之前跟踪 UserControl 的 ID,然后在回发时重新创建控件并重新分配 ID,它应该会自动重新加载 ViewState。

    【讨论】:

    • 哦,是的,我忘了说。实际上,我在每次回发时都重新创建了用户控件,并确保每次的 ID 都是相同的。问题不在于 ViewState 无法恢复,而是 LoadControl 和 placeHolder.Controls.Add 之间的视图状态更改不会持续存在,除非我在将控件添加到页面后明确重复更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    相关资源
    最近更新 更多