我是否需要viewstate来输入控件,如复选框,文本框等?

时间:2012-08-15 12:27:13

标签: asp.net

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

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

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

此外,如果我不需要此控件的viewstate,那么是否有一个不需要viewstate的所有控件的列表?

3 个答案:

答案 0 :(得分:6)

即使ViewState处于关闭状态,所有实现IPostBackDataHandler的控件都会加载它们的值。请注意,禁用ViewState时,TextChanged等事件和ForeColor等其他属性不起作用。

以下是实施IPostBackDataHandler

的控件列表
  • 复选框
  • 的CheckBoxList
  • 的DropDownList
  • HtmlInputCheckBox
  • HtmlInputFile
  • HtmlInputHidden
  • HtmlInputImage
  • HtmlInputRadioButton
  • 的HtmlInputText
  • HtmlSelect
  • HtmlTextArea
  • 的ImageButton
  • 列表框
  • 单选按钮列表
  • 文本框

Why textbox persists data during postback even if View State set to off

  

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

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

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

答案 1 :(得分:2)

ViewState在请求之间保持数据是一个混乱的黑客行为。网络是无状态的,ViewState会尝试使其显示为有状态。

我相信TextBox(以及其他<input/>控件)保留其值ViewState,因为它们的值是以表单形式发布的,而Label({{1} })值不是。请参阅@Tim Schmelter的答案。

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

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

答案 2 :(得分:0)

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