话说第一次接触.NET,就是从ASP.NET开始的,那是2003年的暑假,大学刚刚毕业,考上了研究生,被导师留下,跟师兄师姐们做项目。
之前用ASP比较多,感觉把HTML和ASP代码写在一起比较累。此时接触ASP.NET,其webform的概念使我眼前一亮——微软使得WEB开发能够像winform开发的那种模式了,而且代码分离。
再后来,断断续续的,接触ASP.NET比较少了,也没有那次那么系统和集中,因为在后来读研乃至于读博的过程中,跟着导师做项目,做了一些winform的开发,还回归到MFC过,总之是需要什么就用什么,杂,但是不够精。
博士临毕业时,接触到了Ruby On Rails,又呼吸到了另外一种清新的空气,借着Rails里面的RJS,也稍许接触了Ajax这个久仰大名的技术。
再后来——也就是现在啦,工作后自己接手的第一个小项目,又采用ASP.NET开发。现在虽然.NET框架已经到了3.5版本了,但是我们用2.0就已经足够(当然也就无法体验MVC.NET了)。以前就知道,2.0框架中的控件、组件比1.1丰富了不少,所以开发过程中,还着实现学现卖了一些东西。摸索新控件的使用倒不是什么难事,但是在页面的布局、以及要实现的一些客户端效果甚或是Ajax时,ASP.NET的WebForm模式实在是有点让人……
1、把控件从工具箱中拖拽到页面上,我总是感觉它们粗大笨重,样式难看,当然,可以用CSS,但是去掉那些.NET自作主张加上的一大堆style属性,很令人不舒服。
2、在VS下用table布局实在是太费劲了,多数情况下我就直接改HTML代码,反正习惯了,感觉这样控制起来更精准。
3、早就听说masterpage这个东东,于是兴致勃勃地打算用它,可是结果却发现它的布局也不过是用table而已,导致我不知如何让左边菜单项的链接显示在右边的ContentPlaceHolder中,并保持整个页面的无刷新。后来干脆还是用frame页面实现的。
4、Ajax技术的应用:首先,控件里已经带了一些,像updatepanel之类,效果还是挺好,也装了一些扩展控件。另外还有一个Ajax.net,看了一下,安装后,需要做一些配置,并且也要对Ajax相关函数做特殊处理。最终,还是借用在rails项目中使用RJS的经验,应用了prototype——其实也就是用了其中的Ajax.Updater。后来看到过网上讨论prototype、jquery等框架,似乎用jquery的人比较多,不过鉴于我想对来说对prototype较为熟悉,而且我还真未打算用框架写javascript,而只是用一点点Ajax来实现页面无刷新而已(呃,说来惭愧,至今还停留在一个Ajax.Updater的使用……),Ajax中更多的酷炫效果我暂时也并无需求,故而暂时打消牺牲项目进度学习新的框架的念头。
5、想要增强页面的操作效果和体验,webform的postback造成了不少的麻烦,总之,感觉webform的机制与javascript混合起来用,总给人一种把本来简单的事情复杂化了的感觉。
6、接触了rails之后,又让我捡起在页面上使用“<%%>”代码块,将服务端处理好的结果在页面上显示的方式(比如用for循环画table显示列表),然而.NET中有gridview,它的一套控制方式,包括样式设定方式,与<%%>代码块的方式完全是两码事。不过总的来说,gridview还是好用一些,尤其是分页部分不用自己做了,关键在于用好模板列、命令列,以及控制好它的CSS样式。
此外,由于项目是属于某个母项目的子项目,所以是沿用母系统的CSS样式、页面结构等。此过程中,发现ASP.NET默认自带的那行
“<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">”
使得页面样式在IE6下无法正常显示。当然这个不能怪.NET,毕竟在当下WEB标准稍显混乱的情况下,还是应该尽量按照标准来。
此间还遇到了一些代码在不同浏览器以及相同浏览器的不同版本下的效果不同问题,比如js中,dom下的tr、td使用appendChild方法在IE6中无效之类,这种问题着实讨厌。当然,这个不是ASP.NET的罪。
Webform这种模式,不知在如今被Ajax技术带领的富客户端形势下,是否需要考虑回归呢?
还有,不妨再提个小技巧吧:对于HTML控件,比如<input>(文本框、按钮等),在其属性中添加“runat='server'”,就能在后台代码使用其id值对其直接访问了,可以直接获取其Value属性。而一些.NET控件,也会有onClientClick属性,以响应客户端的点击事件,就像客户端控件的onclick一样。不过onClientClick和onClick那个先响应,以及二者是否有什么逻辑约束,还未仔细探究过。