0

我遇到了以下问题。

我们在我们的框架中有一些 web 控件,它们有一个属性 IsMustField。如果设置了此属性,则 CreateChildControls 方法会更改一些 CSS 并向控件添加 JS Validator。到目前为止,一切都很好。现在我正在尝试实现一个轻微的通用控件。它的一些文本字段在一种情况下使用时是必须字段,但在其他情况下则不是。决定,如果一个字段是必须的字段是在控件的 OnLoad 方法中完成的。

当我第一次打开页面时,一切正常。一旦我点击保存并完成回发,页面就会加载。IsMustField 字段的初始值设置为 ascx 中的值(在本例中为 true)。然后它第一次调用 ProcessPostData。这调用了 EnsureChildControls 方法,因此调用了我们控件的 CreateChildControls 方法。由于在此方法中附加了 CSS 和 JS 验证器,因此将添加它们,就好像控件是必须字段一样。之后,调用我的通用控件的 OnLoad 方法,并将 IsMustField 设置为 false。但是由于它已经调用了 CreateChildControls 方法,所以它不再具有预期的效果。

现在我的问题是:是否有可能以某种方式抑制 ProcessPostData 第一次尝试并仅第二次调用它,以便在我的通用控件将 IsMustField 设置为 false 之后加载控件?还是我必须寻找另一种解决方案。顺便说一句:我知道实现很糟糕......但我不能改变框架,所以我别无选择:)

我希望你们能帮助我

问候, crazy_crank

4

1 回答 1

0

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

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

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

有关页面生命周期的信息,请参阅此 MSDN 文章。IMO,这是你能做的最好的事情,成为一个强大的 ASP.NET 开发人员!:)

于 2012-07-02T14:26:10.987 回答