邪恶的webform
你们真的以为webform易学易用?今天帮同事处理以前遗留的webform项目,回想起了我的伤心往事……
我毕业的时候coding经验不少,但没做过web开发。我掌握webform确实很快,一个多月就能熟悉所有基本控件了。但是,我也只能用控件,不可以做任何个性化的东西,也不可以做任何UI方面没有控件去支持的事情。为了解决我面对的问题 ,我不得不去了深入解webform控件的生命周期,知道它怎样去分析aspx模板,怎样处理请求,怎样构造控件树。可以说webform控件我用的熟透了。但是我仍然有不少事情想做但做不了,于是我又不得不去了解html和javascript。当时我还是以使用控件为主,所以我也没有怎么系统的去学习html和js,只是即学即用。我是绞尽脑汁,用尽奇技淫巧去做一些ui组件出来,但是因为跟webform混在一起,限制实在太多了:
- 你不能用js改变控件相对应的dom结构,否则postback后还原viewstate的过程中会出错;
- 你没办法给webform控件生成的html tag加控件不支持的attributte,你又得回到后台在Page_Load时control.Attributes.Add();
- 如果你想使用ajax的话,一堆陷阱在等着你。用xmlhttp发出的请求并不符合webform的标准流程,于是后台Page实例的一堆属性是空的,最让新手恐惧的NullReferenceException就出现了;
- 你也别指望webform能为你的Ajax.Updater返回一个视图的片段。因为你并没有办法完全控制webform控件会生成什么东西给你。举一个实例:在我公司一个历史遗留下来的webform项目里,一个历史遗留下来的webform程序员企图用prototype去更新部分内容,结果死活都是没反应,后来我帮忙处理的时候才发现,他用一个aspx来处理ajax请求并返回要更新的视图片段,这个aspx包含了一些控件,并且控件包含在一个runat="server"的form里面——事实上很多asp.net程序员连什么是form都不知道。而在客户端,要更新的区域也包含在form里面,由于form不能嵌套在form里面,ie会抛出“参数无效”的错误。于是他又尝试把form标签删了,结果还是死路一条,因为需要postback的控件都必须要摆在form控件里。最后,他因为不能用控件而显露出很不满的神情,而我,则露出想抽他两巴掌的神情。
不要跟我说还有Ajax.Net之类的东西,或许这是唯一的办法——遇到不能解决的新需求,ms或其他控件厂商就去开发新的控件或框架,然后程序员们都使劲的跟着去学习使用他们,asp.net 2.0解决了不少1.1的不足,Ajax.net又解决了现有控件的不足,但这是治标不治本的,你算算为了解决这些问题,你总共花了多少时间?只要有webform在,你就没办法用js去自由的操作dom。
webform入门的学习成本是比较低,但是精通webform比精通 js + xhtml + css 难多了。更郁闷的是,就算你精通了webform,你用它还是会有很多事情做不了,最终还是要靠js,html,codebehind代码杂交,迁就着webform的特性,兜一个大圈去实现功能。webform纯粹是忽悠,用来忽悠winform程序员转到asp.net平台的!