ASP.NET 抑制 ProcessPostData 的第一次尝试

问题描述 投票:0回答:1

我们的框架中有一些 Web 控件,它们具有属性

IsMustField
。如果设置了此属性,则
CreateChildControls()
方法会更改一些 CSS 并向控件添加 JS 验证器。到目前为止一切顺利。

现在我正在尝试实现一个稍微通用的控件。它的某些文本字段在一种情况下使用时是“必须”字段,但在其他情况下则不是。决定某个字段是否为“必须”字段是在控件的

OnLoad
方法中完成的。

当我第一次打开页面时,一切正常。一旦我点击保存并完成回发,页面就会被加载。

IsMustField
字段的初始值设置为 ascx 中的值(在本例中为
true
)。然后它第一次调用
ProcessPostData()
。这会调用
EnsureChildControls()
方法,从而调用我们控件的
CreateChildControls()
方法。 由于 CSS 和 JS Validator 附加在该方法中,因此将添加这些内容,就好像该控件是必须字段一样。之后,我的通用控件的
OnLoad()
方法被调用,并且
IsMustField
设置为
false

但是由于它已经调用了

CreateChildControls()
方法,所以这已经没有达到预期的效果了。

现在我的问题是:是否有可能以某种方式抑制

ProcessPostData
第一次尝试,只在第二次调用它,以便在我的通用控件将
IsMustField
设置为
false
后加载控件?或者我必须寻找其他解决方案。

我知道实现很糟糕,但我无法改变框架,所以我别无选择。

asp.net .net lifecycle
1个回答
0
投票

听起来您有两个选择:要么在生命周期的早期设置 IsMustField 值,要么在生命周期的后期执行“添加验证器”行为。这是几个例子:

如果您在页面生命周期的早期设置“isMustField”(例如Page_Init()),它将在ProcessPostData之前执行。此方法假设您的 isMustField 决策行为不依赖于用户输入(因为它会在加载 ViewState 之前发生)。

第二种选择是等到生命周期的后期再决定是否应用 JS 验证器。如果您将该功能移至 Page_PreRender(而不是 CreateChildControls),那么在您决定哪些控件 IsMustField = true 之前,页面将有机会完全处理视图状态以及任何事件。

请参阅这篇 MSDN 文章,了解有关页面生命周期的信息。在我看来,成为一名强大的 ASP.NET 开发人员是您能做的最好的事情! :)

© www.soinside.com 2019 - 2024. All rights reserved.