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

时间:2013-09-22 00:06:04

标签: c#

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

现在我想关闭EnableViewState并查看点击不会累积。所以我关闭了文本框(名为txtCount)的EnableViewState(EnableViewState =“False”),但不知怎的,它仍然在不断计算和累积我的点击次数。我在这里错过了什么吗?如何在没有ViewState的情况下维护此文本框的状态?

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

3 个答案:

答案 0 :(得分:4)

您没有使用ViewState,您正在使用表单元素本身。在这里,您可以从表单元素中读取:

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

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

txtCount.Text = count.ToString();

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

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

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

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

答案 1 :(得分:1)

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

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

虽然你没有展示你的标记,但我会假装你拥有这个:

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

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

服务器通过7Form收到两条数据,即回发数据(ViewState),这是隐藏字段。

在您的示例中,文本框视图中的ViewState包含数据Enter a number here,而Form包含用户实际键入文本框的值。

注意:顺便说一句,如果你看一下ASP.NET MVC,你会发现ViewState甚至不存在。在学习了一些ASP.NET WebForms结构之后,我建议你阅读Compatibility of ASP.NET Web Forms and ASP.NET MVC

答案 2 :(得分:1)

上面两个都是非常好的答案。记住它的一个好方法(并且实现为什么需要ViewState)是标准HTML表单元素(例如asp:TextBox,它呈现为HTML输入)将包含在POST中,而非标准HTML表单元素(例如asp:作为HTML范围呈现的标签)不会这样,你必须在ViewState中使用它们。

尝试将asp:TextBox切换为asp:Label。关闭ViewState时会看到它中断,但它适用于ViewState。这是因为HTML表单帖子中不包含HTML跨度值。

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