我想知道控制状态和ipostbackdatahandler的相似性。
我已经禁用了视图状态,然后还保留了文本框中的值,为什么会发生这种情况?是因为控制状态还是“我回发数据处理程序”界面。
如果是因为控制状态,那么请解释原因。
答案 0 :(得分:0)
View State如何运作?
如果任何控件的“查看状态”处于启用状态,则在LoadViewstate期间,上次保存的“查看状态”数据将填充到控件中。最后,作为控件层次结构的一部分的每个控件的SaveViewState方法被调用,并且所有控件的组合View State得到base64编码和保存。 因此,我们知道每次页面访问服务器时都会重新创建页面,所以在viewstate的帮助下可以使用数据持久性。
即使我们设置了一些控件的视图状态,如文本框,复选框等等。数据在回发期间仍然存在。即,每当提交页面或将页面发回服务器时,整个表单数据作为具有该请求的集合被发布到服务器。该集合采用NamedValue集合的形式,此集合具有控件的uniqueid和控件的值的映射。您可以使用以下代码段
从表单集中读取数据//Reading textbox value from the form collection
string textboxvalue = Request.Form[textbox1.UniqueID];
ASP.NET使用此原语更新控件的值。 ASP.NET使用IPostBackDataHandler
作为从表单集合加载数据的控件。
实际上所有实现IPostbackdatahandler的控件都实现了LoadPostData和RaisePostDataChangedEvent方法。但是这里的关键方法是LoadPostData,如果发布的值从之前的值更改并使用发布的值更新它,则返回true,否则返回false。让我们看看这里的示例代码
public virtual bool LoadPostData(string uniqueId,
NameValueCollection postedCollection) {
//Getting the current value of control
String currentValue = this.Text;
//Getting the posted value from the form collection
String postedValue = postedCollection[uniqueId];
//Checks whether the posted value is changed from the current value, if yes updates it with the posted value and return yes
if (currentValue == null || !currentValue.Equals(postedValue)) {
this.Text = postedValue;
return true;
}
//else return false
return false;
}
从Page Life Cycle开始,我们可以看到在LoadViewState之后调用LoadPostData,无论viewstate是否打开,它都会从发布的数据中填充。这就是为什么即使viewstate设置为关闭少数控件也会保持数据的原因。以下是控件的完整列表,它们实现了IPostBackDataHandler。
ViewState
在请求之间保持数据是一个混乱的黑客行为。网络是无状态的,ViewState
会尝试使其显示为有状态。
我相信TextBox
(以及其他<input/>
控件)保留其值ViewState
,因为它们的值是以表单形式发布的,而Label
({{1} })值不是。
许多关心页面大小的Web窗体开发人员将全局禁用<span/>
,并仅为特定控件启用它。例如,如果在ViewState
中使用标准分页,则需要GridView
,以便ASP.NET知道用户单击了哪个页码。您可以使用自定义分页并使用页面编号的实际链接,然后关闭ViewState
。