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楼的解释我就不多说了。
说白了就是当你窗体加载事件结束之后 他就去页面执行代码片段的内容
生命周期。。