1

我是一名新的 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();
    }
4

3 回答 3

4

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

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

在这里你写回表单元素:

txtCount.Text = count.ToString();

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

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

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

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

于 2013-09-22T00:21:02.850 回答
1

上面两个都很好的答案。记住它(并了解为什么需要 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

于 2013-09-22T00:46:26.727 回答
1

您误解了回发数据 ( Form) 和ViewState.

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

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

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

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

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

在您的示例中,ViewState从文本框的角度来看, 包含 data Enter a number here,而Form包含用户实际输入到文本框中的值。

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

于 2013-09-22T00:27:29.810 回答