我想知道控制状态和 ipostbackdatahandler 的相似之处。
我禁用了视图状态,然后还保留了文本框的值,为什么会发生这种情况?是因为控制状态还是“我回发数据处理程序”接口。
如果是因为控制状态,请解释原因。
我想知道控制状态和 ipostbackdatahandler 的相似之处。
我禁用了视图状态,然后还保留了文本框的值,为什么会发生这种情况?是因为控制状态还是“我回发数据处理程序”接口。
如果是因为控制状态,请解释原因。
视图状态如何工作?
如果任何控件的 View State 处于打开状态,则在 LoadViewstate 期间,上次保存的 View State 数据将填充到控件中。最后,作为控件层次结构一部分的每个控件的 SaveViewState 方法被调用,所有控件的组合视图状态被 base64 编码并保存。因此,我们知道每次页面访问服务器时都会重新创建页面,数据持久性是在视图状态的帮助下完成的。
即使我们设置了一些控件(如文本框、复选框等)的视图状态。数据在回发期间仍然存在。即,每当页面提交或回传到服务器时,整个表单数据都会作为请求的集合发布到服务器。该集合是NamedValue 集合的形式,该集合具有控件的uniqueid 和控件的值的映射关系。您可以使用以下代码片段从表单集合中读取数据
//Reading textbox value from the form collection
string textboxvalue = Request.Form[textbox1.UniqueID];
ASP.NET 使用此原语来更新控件的值。ASP.NETIPostBackDataHandler
用于从表单集合加载数据的控件。实际上所有实现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;
}
从页面生命周期中,我们可以看到 LoadPostData 在 LoadViewState 之后调用,无论视图状态是否打开,它都是从发布的数据中填充的。这就是为什么即使视图状态为少数控件设置为关闭,数据也会保留的原因。以下是控件的完整列表,这些控件实现了 IPostBackDataHandler。
ViewState
在请求之间持久化数据是一种混乱的黑客行为。网络是无状态的,并ViewState
试图让它看起来有状态。
我相信TextBox
(和其他<input/>
控件)保持它们的值,ViewState
因为它们的值是在表单中发布的,而Label
( <span/>
) 值不是。
许多关心页面大小的 Web 窗体开发人员将ViewState
全局禁用,并且只为特定控件启用它。例如,如果您在 a 中使用标准分页GridView
,则需要ViewState
让 ASP.NET 知道用户单击了哪个页码。您可以使用自定义分页并为页码使用实际链接,然后关闭ViewState
。