有一个问题一直被困扰,有谁做过Webform UI层的插件扩展,希望有这方面经验者给些建议。
我们现在使用WEBFORM,做一个高度扩展性的平台化产品,打算开发一个UI层的插件扩展体系,要求扩展开发时不能修改和覆盖一次开发的aspx页面文件,也不能直接修改后台的C#代码(因为不打算提供一次开发源码给二次开发人员),只能在后台通过MEF(微软一种插件技术)或XML配置文件动态找到二次开发的DLL,并反射动态添加界面组件或修改已有的界面实现界面的定制。
这种方案用服务器控件,用ViewState保持状态,尽量避免二次开发使用CSS、HTML、Javascript,这样二次开发几乎全部可以在后台完成,减少二次开发的难度。为了减少页面大小,减少传输量,我们将ViewState不保存在页面中,而是保存到内存中(另外的分布式缓存服务器)。这种方法基本倾向于在后台开发而不是前台,而且使用ViewState保持状态,性能会有所损失,但是我们需要这种扩展性。
但是存在一个问题,如果一个页面A的某个界面部分B是在页面A上点击某按钮(按钮click事件)动态通过后台的MEF动态创建和插入的,再下次页面被Postback后,这些动态添加的界面不能在后台的组件树中恢复,Render出来的页面动态添加的部分就不见了。为了解决这个问题,许多人在Page_Load中重新创建这些动态添加的组件,解决某个具体问题看起来可以,但是对于通用的插件体系来说就不优雅了,因为PageLoad事件中不知道点击过哪些按钮,曾经动态添加过哪些组件,如何动态重新创建这些组件呢?
另外webform,服务端页面我能自己缓存吗?比如页面首次加载以后就放到缓存中,如果Postback就直接恢复到内存中,而不是每次重新加载静态aspx页面文件,执行PageLoad,恢复ViewState这个过程。