Asp.net 控件';在其父项';渲染方法?

Asp.net 控件';在其父项';渲染方法?,asp.net,webforms,asp.net-2.0,viewstate,Asp.net,Webforms,Asp.net 2.0,Viewstate,我在UserControl中有如下代码: Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) If someCondition Then childControl.Enabled = false End If MyBase.Render(writer) End Sub 在渲染事件期间,每当someCondition为true且childControl.

我在UserControl中有如下代码:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
    If someCondition Then
        childControl.Enabled = false
    End If

    MyBase.Render(writer)
End Sub
在渲染事件期间,每当someCondition为true且childControl.Enabled设置为false时,childControl的ViewState将被销毁(即,如果它是文本框,则用户输入的文本将丢失)

请注意,只有ViewState会丢失。。。控件在第一次渲染时仍然使用正确的属性值。只有在回发时,从ViewState恢复属性时,值才会实际丢失

时间表如下:

  • 页面加载(首字母)
    属性是通过代码设置的
  • 保存视图状态
  • 渲染
    属性被修改
  • 回发发生
  • LoadViewState
  • 页面加载
    未更改控件的值仍然可用,但在渲染方法期间设置了属性的控件为空
  • 保存视图状态

我的理解是,ViewState在调用Control.SaveViewState期间变为固定状态,这发生在调用Control.Render之前。。。但是,我是否缺少一些细微差别?

禁用的控件是否会发布空值?还是什么都不发?老实说,我忘了。但是如果他们发布空值,那么您的viewstate将被覆盖,就像您在文本框中键入新内容然后发布页面一样。

除了在呈现页面时正确显示值之外。只有在回发之后,丢失的ViewState才会显现出来。换言之,如果它被渲染得很好也就不足为奇了。。。但在LoadViewState和Page_Load之间缺少一个步骤。。。使用发布的表单值更新控件的步骤。这就是你的问题。你知道,我想你可能是对的。为了做到这一点,控件必须在调用呈现方法之前决定是从ViewState读取还是从表单提交。我会仔细检查输出,看看会发生什么。我相信每次都会这样。但处理回发数据排在第二位,ViewState被覆盖。顺便说一句,如果您想避免这种行为,那么实现自己的LoadPostData看起来相当容易:您可以只检查“someCondition”,而不更新控件的值。