日期:2014-05-17  浏览次数:20467 次

ViewState生命周期的问题
先发下测试代码。
public string hello
  {
  get
  {
  if (string.IsNullOrEmpty(Convert.ToString(ViewState["hello"])))
  {
  ViewState["hello"] = System.Guid.NewGuid().ToString();
  }
  return ViewState["hello"].ToString();
  }
  }

   
  protected void Page_Load(object sender, EventArgs e)
  {
  if (!IsPostBack)
  {
  Label1.Text = hello;
  }
  }

  protected void a_Click(object sender, EventArgs e)
  {
  abc.Text = hello;
  }

这是页面代码
HTML code
<span><%=hello %></span>
    
    <div>
    <asp:Label runat="server" ID="Label1"></asp:Label>
    <asp:Label runat="server" ID="abc"></asp:Label>
    <asp:Button runat="server" ID="a" Text="hello world" onclick="a_Click" />
    
    </div>

当标红的那句去掉后。hello 呈现的数据 和 abc 的数据会不同。
而当有 红色的代码时,数据都是一样的。
求解..

------解决方案--------------------
Label1.Text = hello; 这一句是在页面第一次加载的时候执行。
执行完成后, ViewState["hello"] 就有值了。
所以每次都取到相同的。

如果没有Label1.Text = hello; 就会每次都Lable1.Text 就一直是空, 而abc.Text 每次不一样。

你应该去了解一下asp.net 的生命周期。
------解决方案--------------------

你自己把 Label1.Text = hello; 

IsPostBack位置换着调试 就知道原因了
------解决方案--------------------
LZ我完全复制你的代码,不管有没有红色的那个,数据都是一样的。而且实际的编译和红色部分没什么关系的
------解决方案--------------------
LZ看看页面的生命周期,然后看看页面一些事件的执行顺序。
------解决方案--------------------
<%=hello%>
是在页面的渲染阶段执行的,也就相当于Response.Write(hello);
而ViewState的保存在是Render阶段之前的,所以在以后对ViewState的操作将不会被保存到ViewState序列号为base64发送到客户端的字符串中
------解决方案--------------------
你做个断点 然后单步调试就明白为什么了

还有就是看 生命周期 就知道为什么了 8楼的解释我就不多说了。

说白了就是当你窗体加载事件结束之后 他就去页面执行代码片段的内容

生命周期。。