ViewState生命周期的问题

xedcoing 2012-05-24 10:00:33
先发下测试代码。
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;
}

这是页面代码
<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 的数据会不同。
而当有 红色的代码时,数据都是一样的。
求解..
...全文
622 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xedcoing 2012-05-24
  • 打赏
  • 举报
回复
我看了一下,是我在提问的时候没说清楚..例子也不够好..

是当没有Label1.Text=hello时,
页面上的 <span><%=hello %></span>
和 <asp:Label runat="server" ID="abc"></asp:Label>
的值会不同。
xedcoing 2012-05-24
  • 打赏
  • 举报
回复
谢谢大家的回复。

但好像大家都忽视了我页面上的
<span><%=hello %></span>
这段代码。

这个在编译的时候,会去访问后台的 hello属性。
ViewState 在后来点击button 事件的时候又重新赋值一次。

问题就出在这,为什么页面调用属性的时候,ViewState没有保存下来。
xedcoing 2012-05-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
Label1.Text = hello; 这一句是在页面第一次加载的时候执行。
执行完成后, ViewState["hello"] 就有值了。
所以每次都取到相同的。

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

你应该去了解一下asp.net 的生命周期。
[/Quote]
这个我知道问题出在哪,但不知道为何会这样 。

你看我页面上有一个引用了hello 的代码
<span><%=hello %></span>
这个在访问页面的时候都会去执行一次

public string hello
{
get
{
if (string.IsNullOrEmpty(Convert.ToString(ViewState["hello"])))
{
ViewState["hello"] = System.Guid.NewGuid().ToString();
}
return ViewState["hello"].ToString();
}
}



可是ViewState没有保存下来。
zhangdaowu5 2012-05-24
  • 打赏
  • 举报
回复
LZ看看页面的生命周期,然后看看页面一些事件的执行顺序。
licai1210 2012-05-24
  • 打赏
  • 举报
回复
LZ我完全复制你的代码,不管有没有红色的那个,数据都是一样的。而且实际的编译和红色部分没什么关系的
ycproc 2012-05-24
  • 打赏
  • 举报
回复

你自己把 Label1.Text = hello;

IsPostBack位置换着调试 就知道原因了
丰常青 2012-05-24
  • 打赏
  • 举报
回复
Label1.Text = hello; 这一句是在页面第一次加载的时候执行。
执行完成后, ViewState["hello"] 就有值了。
所以每次都取到相同的。

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

你应该去了解一下asp.net 的生命周期。
xedcoing 2012-05-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

<%=hello%>
是在页面的渲染阶段执行的,也就相当于Response.Write(hello);
而ViewState的保存在是Render阶段之前的,所以在以后对ViewState的操作将不会被保存到ViewState序列号为base64发送到客户端的字符串中
[/Quote]
原来如此 ..

发现这个问题的时候我也是一直在百度生命周期的相关内容..
看了良久还是发现不到原因 ..
多谢兄弟告知,小弟不胜感激..
快乐的小二兔 2012-05-24
  • 打赏
  • 举报
回复
你做个断点 然后单步调试就明白为什么了

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

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

生命周期。。
licai1210 2012-05-24
  • 打赏
  • 举报
回复
<%=hello%>
是在页面的渲染阶段执行的,也就相当于Response.Write(hello);
而ViewState的保存在是Render阶段之前的,所以在以后对ViewState的操作将不会被保存到ViewState序列号为base64发送到客户端的字符串中

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧