当EnableViewstate = false
和我回发时,我的文本框控件会保留文本值,但标签控件不会。我正在更改按钮的单击事件上的标签和文本框的文本。
protected void Button1_Click(object sender, EventArgs e)
{
TextBox1.Text = "Message Changed";
Label1.Text = "Message Changed";
}
我的页面还有另一个按钮用于回发。
此外,如果我不需要此控件的viewstate,那么是否有一个不需要viewstate的所有控件的列表?
答案 0 :(得分:6)
即使ViewState处于关闭状态,所有实现IPostBackDataHandler
的控件都会加载它们的值。请注意,禁用ViewState时,TextChanged
等事件和ForeColor
等其他属性不起作用。
以下是实施IPostBackDataHandler
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保留了数据,我认为浏览器还将文本框值存储在其缓存中。