2

我想知道控制状态和 ipostbackdatahandler 的相似之处。

我禁用了视图状态,然后还保留了文本框的值,为什么会发生这种情况?是因为控制状态还是“我回发数据处理程序”接口。

如果是因为控制状态,请解释原因。

4

1 回答 1

0

视图状态如何工作?

如果任何控件的 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。

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

资源

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

我相信TextBox(和其他<input/>控件)保持它们的值,ViewState因为它们的值是在表单中发布的,而Label( <span/>) 值不是。

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

于 2014-01-02T09:31:33.230 回答