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