为什么改变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"文本。
好的,我删除了我之前的答案,我将尝试用一个例子来重新陈述。
首先,正如其他人所说,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在客户端实现为隐藏字段)。当所有内容进入浏览器时,我们可以看到Label1
和Label2
都显示Before click
。
为了确定它,我们将做第三个回发,现在再次点击Button1
。与第一次回发时一样,Label1
以Changed
文本结束。但是Label2
呢?这个启用了ViewState,所以在初始标记解析ASP。. NET给它赋值Blah
,在ViewState加载期间,它用Before click
替换这个值。在页面生命周期中,没有其他任何东西影响这个值(这次我们没有单击Button2),因此我们最终在浏览器中看到Changed
和Before click
。
希望它能说清楚ViewState的作用和禁用它的作用。如果您想更深入地了解ViewState是如何工作的,我强烈推荐这篇文章:真正理解ViewState.
我认为你对ViewState的理解是错误的。
ViewState中的数据存储在请求之间,而不是在页面生命周期中。顺便说一句,ViewState数据是在SaveStateComplete事件中的PreRenderComplete事件之后生成的。
https://msdn.microsoft.com/en-us/library/ms178472.aspx如果你关闭了ViewState,就认为它不会在输出中生成。
在页面生命周期中,分配给控件(以及页面字段和属性,因为页面只是一个类)的所有数据将按照您在aspx中定义的方式呈现。但是之后会丢失,除非保存在ViewState中。