我们的框架中有一些 Web 控件,它们具有属性
IsMustField
。如果设置了此属性,则 CreateChildControls()
方法会更改一些 CSS 并向控件添加 JS 验证器。到目前为止一切顺利。
现在我正在尝试实现一个稍微通用的控件。它的某些文本字段在一种情况下使用时是“必须”字段,但在其他情况下则不是。决定某个字段是否为“必须”字段是在控件的
OnLoad
方法中完成的。
当我第一次打开页面时,一切正常。一旦我点击保存并完成回发,页面就会被加载。
IsMustField
字段的初始值设置为 ascx 中的值(在本例中为 true
)。然后它第一次调用 ProcessPostData()
。这会调用 EnsureChildControls()
方法,从而调用我们控件的 CreateChildControls()
方法。
由于 CSS 和 JS Validator 附加在该方法中,因此将添加这些内容,就好像该控件是必须字段一样。之后,我的通用控件的 OnLoad()
方法被调用,并且 IsMustField
设置为 false
。
但是由于它已经调用了
CreateChildControls()
方法,所以这已经没有达到预期的效果了。
现在我的问题是:是否有可能以某种方式抑制
ProcessPostData
第一次尝试,只在第二次调用它,以便在我的通用控件将 IsMustField
设置为 false
后加载控件?或者我必须寻找其他解决方案。
我知道实现很糟糕,但我无法改变框架,所以我别无选择。
听起来您有两个选择:要么在生命周期的早期设置 IsMustField 值,要么在生命周期的后期执行“添加验证器”行为。这是几个例子:
如果您在页面生命周期的早期设置“isMustField”(例如Page_Init()),它将在ProcessPostData之前执行。此方法假设您的 isMustField 决策行为不依赖于用户输入(因为它会在加载 ViewState 之前发生)。
第二种选择是等到生命周期的后期再决定是否应用 JS 验证器。如果您将该功能移至 Page_PreRender(而不是 CreateChildControls),那么在您决定哪些控件 IsMustField = true 之前,页面将有机会完全处理视图状态以及任何事件。
请参阅这篇 MSDN 文章,了解有关页面生命周期的信息。在我看来,成为一名强大的 ASP.NET 开发人员是您能做的最好的事情! :)