为什么标签的价值会发生变化?

J.P*_*J.P 5 c# asp.net

我知道即使为TextBox禁用ViewState,我们也不会丢失数据,因为它实现了IPostBackDataHandler接口.

<asp:TextBox ID="TextBox1" runat="server" EnableViewState="False"/>
Run Code Online (Sandbox Code Playgroud)

但我的问题是为什么标签也会出现这种情况呢?为什么标签不会丢失它的数据,即使ViewState被禁用,因为标签没有实现IPostBackDataHandler接口?

<asp:Label ID="Label1" runat="server" EnableViewState="False" ViewStateMode="Disabled"/>
Run Code Online (Sandbox Code Playgroud)

TextBox定义:

public class TextBox : WebControl, IPostBackDataHandler,
Run Code Online (Sandbox Code Playgroud)

标签定义:

public class Label : WebControl, ITextControl
Run Code Online (Sandbox Code Playgroud)

我的代码:

<form id="form1" runat="server">
<div>
    <asp:Label ID="Label1" runat="server" EnableViewState="False" ViewStateMode="Disabled" Text="Before click"></asp:Label>
    <asp:TextBox ID="TextBox1" runat="server" EnableViewState="False"></asp:TextBox>
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_OnClick"/>
</div>
</form>
Run Code Online (Sandbox Code Playgroud)

和代码背后:

protected void Button1_OnClick(object sender, EventArgs e)
{
    Label1.Text = "Changed.";
}
Run Code Online (Sandbox Code Playgroud)

我点击按钮后,我希望看到标签中的"点击之前",但在点击按钮后,我看到标签中的"已更改"文字.

小智 0

我认为您对 ViewState 是什么有错误的理解。

ViewState 中的数据存储在请求之间,但不在页面生命周期期间存储。顺便说一句 - ViewState 数据是在 SaveStateComplete 事件中的 PreRenderComplete 事件之后生成的。

https://msdn.microsoft.com/en-us/library/ms178472.aspx

如果您关闭了 ViewState - 只是认为它不会在输出中生成。

在页面生命周期期间,分配给控件(以及页面字段和属性,因为页面只是一个类)的所有数据都将按照您在 aspx 中定义的方式呈现。但之后就会丢失,除非保存在ViewState中。