代码之家  ›  专栏  ›  技术社区  ›  AaronLS

视图状态与回发

  •  4
  • AaronLS  · 技术社区  · 15 年前

    我有点回答了我自己的问题,但我想确保我理解正确。我最初认为,当用户在表单中提供值时,回发时这些值作为视图状态的一部分提交,因为textbox.text是视图状态的一部分。现在我发现用户提供的值实际上在onload事件之后才应用到控件。这让我困惑,因为我认为viewstate是在onload之前(或调用controls.add()时)加载到控件中的。我已经浏览了页面上的文档并控制了生命周期,现在我才意识到处理回发数据有一个不同的步骤(这个步骤没有出现在很多文档中:(

    1)所以用户在字段中的类型值postback data是在onload事件之后应用的,而viewstate数据是在onload事件之前应用的?

    2)所以基本上所有这一切意味着,在回发时,服务器为一个textbox.text属性获取两个值,一个在viewstate中,类似于上一个请求的“old”值,以及用户在表单中提供的新值?

    3)NET框架应用回发数据是否与ViewState相同,因为它通过其ID属性找到适当的控件?这一点很重要,因为我正在动态创建控件,甚至可能有一些表单会超时更改结构,需要考虑如何处理ID。到目前为止,我还没有设置ID属性,所有操作都正常,但稍后可能会更复杂。

    4)ViewState数据是否曾经在客户端被修改过?或者视图状态是否与服务器在上一个请求中发送的内容相同(假设没有篡改)?我的印象过去是,服务器将所有控件属性编码到ViewState中,在客户端,当用户提交表单时,ViewState字段被解码、修改、编码,并随修改一起提交到服务器。我以为有很多javascript在为我做这些。现在我想我完全搞错了。相反,在客户端,viewstate似乎永远不会更改,并且所有客户端更改都在回发数据中,这样下一个请求服务器将加载viewstate,加载回发,并在下一个响应中提供新的更新后的viewstate?

    2 回复  |  直到 10 年前
        1
  •  12
  •   Community CDub    8 年前

    1)均在加载前加载
    2)基本上是的。
    3)先应用视图状态,然后发布数据

    引用Scott Mitchell(见下文)

    动态添加的控件必须 以编程方式添加到网页 在每一页上访问。最好的 添加这些控件的时间是在 页面的初始化阶段 生命周期,发生在 加载视图状态阶段。也就是说,我们 希望具有控件层次结构 在加载视图状态之前完成 舞台开始了。因为这个原因 最好为创建事件处理程序 页面类的init事件 代码隐藏类,并添加 动态控制。

    4)除非您在框外执行某种操作,否则视图状态永远不会被修改为客户端。”viewstate”是一个HTML表单字段,在服务器端进行处理。

    以下是一些图片 Understanding ASP.NET View State 通过 Scott Mitchell 那可能对你有帮助。

    alt text http://i.msdn.microsoft.com/ms972976.viewstate_fig02%28en-us,MSDN.10%29.gif alt text http://i.msdn.microsoft.com/ms972976.viewstate_fig04%28en-us,MSDN.10%29.gif

    额外阅读材料: http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx

        2
  •  0
  •   rdg515    10 年前

    我的印象是服务器对所有控件进行了编码 属性转换为视图状态,当用户 提交了表单,对viewstate字段进行了解码、修改, 已编码,并在修改后提交给服务器。

    不,view state的作用只是保留自上次“保存视图状态”页面事件以来的页面状态,即该事件发生在页面呈现给客户机之前不久。

    当客户机选择下拉框或更改文本框中的文本时,客户机页面上作为静态HTML标记存在的隐藏视图状态属性不会动态更改/编码这些值,它与最初呈现页面时保持不变。

    那么,如何保留页面的新状态,即用户下拉选择和文本框值如何保留在ASP控件中?这些下拉选择和文本框值将捕获在回发数据中。

    A server control can indicate that it is interested in examining the posted back data by implementing the IPostBackDataHandler interface. In this stage in the page life cycle, the Page class enumerates the posted back form fields, and searches for the corresponding server control. If it finds the control, it checks to see if the control implements the IPostBackDataHandler interface. If it does, it hands off the appropriate postback data to the server control by calling the control's LoadPostData() method. The server control would then update its state based on this postback data.
    

    -斯科特·米切尔

    推荐文章
    nat  ·  主页面破坏pre_init
    13 年前