为什么改变label'的值

本文关键字:的值 改变 label 为什么 | 更新日期: 2023-09-27 18:17:12

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

<asp:TextBox ID="TextBox1" runat="server" EnableViewState="False"/>

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

<asp:Label ID="Label1" runat="server" EnableViewState="False" ViewStateMode="Disabled"/>

文本框定义:

public class TextBox : WebControl, IPostBackDataHandler,

标签定义:

public class Label : WebControl, ITextControl
我代码:

<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>

和后面的代码:

protected void Button1_OnClick(object sender, EventArgs e)
{
    Label1.Text = "Changed.";
}

我希望在我点击按钮后看到标签中的"Before click",但在我点击按钮后,我看到标签中的"Changed"文本。

为什么改变label'的值

好的,我删除了我之前的答案,我将尝试用一个例子来重新陈述。

首先,正如其他人所说,ViewState的思想是在回发之间保持状态,而不是在单个页面加载周期中,因此您看到的是预期的行为。

要查看与示例的区别,请尝试添加带有两个按钮的标签:

 <asp:Label ID="Label1" runat="server" EnableViewState="False" Text="Before click"></asp:Label>  
 <asp:Button ID="btn1" Text="Click" OnClick="btn1_Click" runat="server" />
 <asp:Button ID="btnReset" Text="Reset" OnClick="btnReset_Click" runat="server" />

其中btn1设置值为"Changed",btnReset为空句柄。

现在EnableViewState设置为False,如果你点击btn1页面重新加载,btn1_Click被执行,页面呈现标签值= "Changed",如果你点击btnReset页面将再次重新加载,但由于视图状态被禁用,标签将恢复到其原始文本"Before click"

如果你将标签上的EnableViewState设置为True,然后点击btn1,然后点击btnReset,标签值将保持为"已更改",因为在回发期间状态保持

希望这能澄清一点

这将是冗长而详细的

让我们从这个标记开始。几乎和你的一模一样,只是多了一个按钮和一个标签。我稍后会解释我们为什么需要它们。

<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"/>
    <asp:Label ID="Label2" runat="server" Text="Blah" />
    <asp:Button ID="Button2" runat="server" Text="Button" OnClick="Button2_OnClick"/>
</div>
</form>

我们将使用后面的代码。同样,我将在后面解释第二个处理程序的用途:

protected void Button1_OnClick(object sender, EventArgs e)
{
    Label1.Text = "Changed";
}
protected void Button2_OnClick(object sender, EventArgs e)
{
    Label2.Text = Label1.Text;
}

让我们看看初始加载页面时会发生什么。第一个ASP。NET读取所有标记,然后使用所有事件遍历页面生命周期。在标记解析阶段,Label1被分配文本Before click,并且在初始加载期间永远不会更改。之后在渲染阶段这就是渲染成HTML并发送给浏览器的内容。因此,Before click显示在屏幕上。很好,很简单。

现在点击Button1。发生回发,这是一个术语,描述在初始加载后由其控件之一向同一页面发送的请求。同样,一切都从ASP开始。NET解析标记,Label1再次被分配文本Before click。但随后会发生页生命周期事件,包括控件事件处理程序。在Button1的处理程序中,Label1的文本被更改为Changed。现在有一件重要的事情需要注意:如果启用了Label1的ViewState,那么这个新值将存储在那里,并且所谓的跟踪将为属性Label1.Text启用。但是ViewState是禁用的,所以新值不会存储在Label1之外的任何地方。接下来是呈现页面阶段,由于Label1.Text仍然保留值Changed,因此这就是呈现为HTML并发送到浏览器以显示的内容。但是请注意,这个新值不是在ViewState字段中发送的。正如您所看到的,ViewState是否启用对回发后显示的内容没有任何影响。

现在我们将单击Button2,这将触发另一次回发。同样,ASP。. NET解析标记,Label1再次获得文本Before click。然后是ViewState加载部分。如果Label1.Text的ViewState被启用,它将加载改变的值到这个属性。但是ViewState被禁用了,所以这个值保持不变。因此,当我们到达Button2点击处理程序时,Label1.Text的值仍然是Before click,它被分配给Label2.Text。但是Label2启用了ViewState,因此这个文本的新值存储在ViewState中并发送给客户端(ViewState在客户端实现为隐藏字段)。当所有内容进入浏览器时,我们可以看到Label1Label2都显示Before click

为了确定它,我们将做第三个回发,现在再次点击Button1。与第一次回发时一样,Label1Changed文本结束。但是Label2呢?这个启用了ViewState,所以在初始标记解析ASP。. NET给它赋值Blah,在ViewState加载期间,它用Before click替换这个值。在页面生命周期中,没有其他任何东西影响这个值(这次我们没有单击Button2),因此我们最终在浏览器中看到ChangedBefore click

希望它能说清楚ViewState的作用和禁用它的作用。如果您想更深入地了解ViewState是如何工作的,我强烈推荐这篇文章:真正理解ViewState.

我认为你对ViewState的理解是错误的。

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

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

如果你关闭了ViewState,就认为它不会在输出中生成。

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