EnableViewState = false - - 但似乎仍在“工作”

本文关键字:工作 false EnableViewState | 更新日期: 2023-09-27 18:32:20

我是一个新的C#程序员,刚刚创建了一个简单的程序。 我首先希望它计算按钮点击次数,保持点击次数(回发)的累积次数。 这奏效了。

现在我想关闭 EnableViewState,看看点击次数不会累积。 所以我关闭了文本框(名为txtCount)的EnableViewState(EnableViewState="False"),但不知何故,它仍然不断计算和累积我在帖子中的点击次数。 我在这里错过了什么吗?如何在不打开视图状态的情况下维护此文本框的状态?

protected void Button1_Click(Object sender, EventArgs e)
    {
        int count = int.Parse(txtCount.Text);
        count++;
        txtCount.Text = count.ToString();
    }

EnableViewState = false - - 但似乎仍在“工作”

你没有使用ViewState,而是在使用表单元素本身。 在这里,您从表单元素中读取:

int count = int.Parse(txtCount.Text);

在这里,您写回表单元素:

txtCount.Text = count.ToString();

因此,该值存储在发送到 HTML 的input中,并作为 HTTP 表单发布的一部分回发。

如果您想更仔细地检查这一点,请查看浏览器的调试工具。 (FireBug,Chrome开发人员工具,IE开发人员工具等) 查找捕获网络活动的选项卡/面板/等。 当您单击按钮时,您需要查看发送到服务器的 POST 请求。

在该 POST 请求中是一系列键/值对。 页面上的每个活动表单元素都会发送一个键/值对,而整个视图状态本身只是隐藏表单元素中的键/值对。 (其中值是 base-64 编码的字符串。 如果表单元素具有相关值,则它在 POST 请求中,因此在服务器端可用。

从帖子之间的文本框中删除文本,它应该停止计数。 (甚至可能在int.Parse()上抛出异常.

上面两个非常好的答案。 记住它(并意识到为什么需要ViewState)的一个好方法是标准HTML表单元素(例如呈现为HTML输入的asp:TextBox)将包含在POST中,而非标准HTML表单元素(例如呈现为HTML跨度的asp:Label)不会因此您必须将它们与ViewState一起使用。

尝试将 asp:TextBox 切换到 asp:Label。 当您关闭 ViewState 时,您会看到它中断,但它在打开 ViewState 时有效。 这是因为 HTML 范围值不包含在 HTML 表单帖子中。

这是一篇讨论ViewState的非常好的文章,尽管它已经很老了:http://msdn.microsoft.com/en-us/library/ms972976.aspx

您误解了回发数据(Form)和ViewState之间的区别。

ViewState实际上是一个包含编码数据的隐藏字段,ASP.NET 使用它在回发时重建页面的某些部分,这就是为什么您认为需要打开它才能使文本框示例正常工作的原因。

虽然您没有显示标记,但我会假装这就是您拥有的:

<asp:TextBox id="txtCount" runat="server" text="Enter a number here" />

现在,用户在运行时键入一个数字(例如7为了参数起见),并将页面发布回服务器。

服务器接收两条数据,回发数据(7)通过FormViewState,这是隐藏字段。

在您的示例中,从文本框的角度来看,ViewState包含数据Enter a number here,而Form包含用户实际键入

文本框的值。

注意:顺便说一句,如果您查看MVC ASP.NET 您会发现ViewState甚至不存在。在学习了一些 ASP.NET Web窗体构造之后,我建议您阅读 ASP.NET Web 窗体的兼容性和 ASP.NET MVC。