【问题标题】:Can access a object after postback - ASP.NET回发后可以访问对象 - ASP.NET
【发布时间】:2009-07-01 00:22:05
【问题描述】:

我真的对这种行为感到困惑。谁能给我解释一下?

我有以下类结构:

public abstract BaseUserControl : System.Web.UI.UserControl
{
  public List<string> listFieldMapper = new List<string>();
}

  public partial class Property : BaseUserControl
  {
    protected override void OnInit(EventArgs e)
    {
      base.OnInit(e);

      base.listFieldMapper.Add("test");
    }
  }

在按钮的事件处理程序中,(导致回发),我可以访问base.listFieldMapper

我的理解是,在回发之间,不维护状态,要能够维护状态,请使用 ViewState 对象。列表如何维护值?

附带说明,如果我在OnInit 之后设置base.listFieldMapper 的值(例如:加载),回发后我有一个空对象。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    我认为当按钮点击调用回发时:

    1. 当服务器处理请求时,用户控件的一个实例正在被实例化。
    2. 然后服务器调用处理按钮点击的方法。

    当页面被请求时(不处理按钮点击):

    1. 当服务器处理请求时,用户控件的一个实例正在被实例化。
    2. 然后服务器调用处理 Load 事件的方法。

    【讨论】:

    • OnLoad 事件总是被调用(无论是否回发)
    【解决方案2】:

    ViewState 在这里不起作用。要让它跟踪任何内容,您需要在其中实际放入一些内容(大多数默认属性都可以)。

    在您的情况下,第一种情况下的事件顺序是(在 init 上设置列表):

    Control.OnInit -> add value
    Page.OnInit    -> value present
    Page.OnLoad    -> value present
    Control.OnLoad -> value present
    #PostBack
    Control.OnInit -> add value
    Page.OnInit    -> value present
    Page.OnLoad    -> value present
    Control.OnLoad -> value present
    Button.OnClick -> value present
    

    在第二种情况下(设置加载列表):

    Control.OnInit -> value absent
    Page.OnInit    -> value absent
    Page.OnLoad    -> value absent
    Control.OnLoad -> add value
    #PostBack
    Control.OnInit -> value absent
    Page.OnInit    -> value absent
    Page.OnLoad    -> value absent
    Control.OnLoad -> add value
    Button.OnClick -> value present
    

    listFieldMapper 本身在类构造函数中被赋值,并且在控件生命周期的任何时候都将是非空的。

    【讨论】:

    • 在第二种情况下,Button.OnClick 上不存在该值
    • 那么有些东西不见了。我复制了你的代码,它像宣传的那样工作。你确定你没有在其他地方做某事吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    相关资源
    最近更新 更多