ViewState 和 Postback 数据是否相同?






4.67/5 (3投票s)
在本技巧中,我们将尝试理解 ViewState 和 Postback 数据是否相同。
引言
在本技巧中,我们将尝试理解 ViewState 和 Postback 数据是否相同。
背景
最近,我遇到了一个问题:“ViewState 和 Postback 数据一样吗?” 您对这个问题的回答是什么? 相同? 不同? 好吧,选择您的答案,然后继续阅读本技巧,我们将探讨细节。
Using the Code
我们将在本帖中使用 ASP.NET Web Forms 应用程序。 创建一个新应用程序,并从 Default.aspx 中删除所有内容,然后将以下控件添加到表单中
- 一个标签,并将其文本更改为默认值以外的其他内容(我将其更改为“初始值”)
- 一个文本框和
- 2 个按钮。 我将其中一个按钮的文本更改为“更改文本”,另一个按钮更改为“点击我”。 这些是随机名称,您可以根据需要命名您的按钮。
进行所有这些更改后,您的表单应如下所示
现在让我们向“更改文本”按钮事件处理程序添加一些代码。 这是为了更改标签和文本框的文本。
protected void btnChange_Click(object sender, EventArgs e)
{
lblCaption.Text = "New Lable caption";
txtInput.Text = "New Text value";
}
双击“点击”按钮以生成事件处理程序。 无需向处理程序添加任何代码。 保持它为空即可。
ViewState
默认情况下为所有服务器控件启用。 您可能已经知道了这一点,但只是提个醒。 现在运行应用程序。
当 UI 出现时,单击“更改文本”按钮以更改标签和文本框的文本。
接下来,单击“点击我”按钮,以回发表单。 当表单在回发后加载时,我们可以注意到更改后的值仍然完好无损。 这是否意味着,ViewState
数据和 Postback
数据是相同的?
让我们更进一步,禁用 textbox
的 viewstate
<asp:TextBox ID="txtInput" runat="server"
EnableViewState="false"></asp:TextBox>
运行应用程序,单击“更改文本”按钮以更改标签和文本框的文本。 然后单击“点击我”按钮以回发表单。
同样,我们注意到当表单在回发后加载时,标签和文本框的更改值都完好无损。 对于标签,viewstate
已启用,因此我们理解它从 viewstate
获取其值。 但是,即使其 viewstate
已禁用,textbox
也会从哪里获取其更改后的值? 这是否意味着 viewstate
和 postback
数据是不同的?
在得出任何结论之前,让我们也禁用 label
的 viewstate
并运行应用程序。
按 F5 运行应用程序,然后单击“更改文本”按钮。 文本将按预期更改。
接下来,单击“点击我”按钮。 现在我们可以看到,当表单在回发后加载时,更改后的值将保留在 textbox
中,而不是 label
中。
作为结束本技巧之前的最后一步,为了更好地理解这一点,让我们深入研究页面跟踪。 通过在页面指令中设置 Trace="true"
来启用页面的跟踪。
运行应用程序。 跟踪将与 UI 一起显示在页面上。 转到跟踪的“表单集合”部分。 当页面最初加载时,它将为空,如下图所示。
现在,单击“更改文本”按钮,看看“表单集合”包含什么。 正如我们在下面的屏幕截图中看到的,它包含 ViewState,以及我们感兴趣的其他两项。
ctl00$MainContent$txtInput
- 这包含文本框的值(它是空的,因为文本的初始值是空的)ctl00$MainContent$btnChange
- 这显示了导致回发的控件
然后单击“点击我”按钮并检查值。 现在我们可以看到
ctl00$MainContent$txtInput
- 具有文本框的新值,即“New Text value
”ctl00$MainContent$btnClick
- 这显示了导致回发的控件。 注意Name
和Value
已更改。
这表明 ViewState
和 postback
数据是不同的。
这也回答了“即使 viewstate
被禁用,textbox
也会从哪里获取其更改后的值?” 这个问题。 它从回发数据中获取其值。
关注点
尽管本技巧表明 viewstate
和 postback
数据是不同的,但需要注意的是,当表单发布到服务器时,viewstate
作为页面回发信息的一部分发送。 我已尽力在本技巧中分享我的理解。 如果我遗漏了任何内容或引用不正确,请随时在评论部分分享。 这将帮助我以及其他读者更好地理解。
这是一个广阔的领域,我只涵盖了一小部分。 以下文章可能会帮助您更好地理解此主题
- http://msdn.microsoft.com/en-us/library/bb386448(v=vs.140).aspx
- https://codeproject.org.cn/Articles/31701/ViewState-and-Postback
历史
- 2015 年 1 月 4 日 - 第一个版本