4

EnableViewstate = false我做回发时,我的文本框控件保留文本值,但标签控件不保留。我正在更改按钮单击事件的标签和文本框的文本。

protected void Button1_Click(object sender, EventArgs e)
{
    TextBox1.Text = "Message Changed";
    Label1.Text = "Message Changed";
}

我的页面还有另一个按钮用于回发。

此外,如果我不需要此控件的视图状态,那么是否有所有不需要视图状态的控件的列表?

4

3 回答 3

6

IPostBackDataHandler即使 ViewState 关闭,所有实现的控件也会加载它们的值。请注意,当 ViewState 被禁用时,事件之类的TextChanged 和其他属性之类ForeColor的将不起作用。

这是实现的控件列表IPostBackDataHandler

  • 复选框
  • 复选框列表
  • 下拉列表
  • HtmlInputCheckBox
  • html输入文件
  • HtmlInputHidden
  • HtmlInputImage
  • HtmlInputRadioButton
  • HtmlInputText
  • html选择
  • HtmlTextArea
  • 图像按钮
  • 列表框
  • 单选按钮列表
  • 文本框

为什么即使视图状态设置为关闭,文本框也会在回发期间保留数据

每当页面提交或回传到服务器时,整个表单数据都会作为请求的集合发布到服务器。该集合是NamedValue 集合的形式,该集合具有控件的uniqueid 和控件的值的映射关系。您可以使用以下代码片段从表单集合中读取数据

//Reading textbox value from the form collection 
string textboxvalue = Request.Form[textbox1.UniqueID];

ASP.NET 使用此原语来更新控件的值。ASP.NET 将 IPostBackDataHandler 用于从表单集合加载数据的控件。

于 2012-08-15T12:56:25.240 回答
2

ViewState在请求之间持久化数据是一种混乱的黑客行为。网络是无状态的,并ViewState试图让它看起来有状态。

我相信TextBox(和其他<input/>控件)保持它们的值,ViewState因为它们的值是在表单中发布的,而Label( <span/>) 值不是。有关更多信息,请参阅@Tim Schmelter 的回答。

许多关心页面大小的 Web 窗体开发人员将ViewState全局禁用,并且只为特定控件启用它。例如,如果您在 a 中使用标准分页GridView,则需要ViewState让 ASP.NET 知道用户单击了哪个页码。您可以使用自定义分页并为页码使用实际链接,然后关闭ViewState

使用 Web 窗体是一项有趣的任务,ViewState因为您失去了服务器控件的许多易于使用的功能,但在控制标记和状态方面获得了更多。但是,我认为如果你想要这么多的控​​制,你应该考虑使用 MVC 而不是 Web 窗体。

于 2012-08-15T12:50:10.290 回答
0

这取决于您的要求。ViewState 用于在页面的多次回发期间保留数据。如果启用了视图状态,则数据将保留,否则将丢失。正如您提到的 TextBox 保留数据,我认为浏览器还将文本框值存储在其缓存中。

于 2012-08-15T12:53:02.727 回答