滥用ASP.NET回发机制影响用户体验

本文针对重视用户体验的人,如果以开发速度和开发成本为王的可以略过不看。

用户体验是一个没有具体标准的玩意,到目前为止仍然没有有效的、通用的方法可以用来检验一款软件或Web产品的用户体验是否良好,但是要证明用户体验糟糕不糟糕很简单,用户一接触就清楚,而用户或许会告诉你或许什么也不说。我把用户体验归纳为这几个方面:

  1. 功能上能用、易用、好用
  2. 服务上适用、够用

当然这里并不是讨论关于用户体验如何定义,切入正题:关于ASP.NET回发对于用户体验的影响主要体现在能不能用好不好用上面,做ASP.NET开发的朋友我想没人不知道“回发”这个词,ASP.NET会把当前页面的状态序列化并保存在一个隐藏的input控件中(Viewstate),在页面的状态发生更改后会把该值和页面上其他控件的值一起发送(post)至服务器端,服务器通过反序列化来匹配更改并执行注册的相应服务器端事件。

为什么说滥用回发会影响用户体验呢?

一. Javascript的兼容性与和谐性

有朋友奇怪了,明明在说ASP.NET,扯Javascript干嘛?那么,你是否知道回发机制是基于Javascript实现的,在客户端进行操作后通过javascript事件对form进行提交,这就是为什么每个aspx页面都会用一个form把整个页面内容包裹起来的原因。这在不支持Javascript的设备上似乎访问会遇到问题,比如部分浏览器、手机、终端设备等。

是否还在纠结这里为什么会有Javascript?你根本就没有写过Javascript!对吧?答案是:ASP.NET自动生成的。自动生成的Javascript与页面中的自定义JS会有冲突和混乱的现象,虽然冲突可以通过规范Javascript代码来避免,但是执行时造成的混乱很难避免,比如一个ASP的linkbutton会注册一个__dopostback()事件,该事件是无法截停的,只要你点击了,无法通过Javascript事件的return false来阻止回发。

我碰到的一个小插曲:一个页面在点击某一按钮的时候要更新一段文字,我写了一段JS通过AJAX来实现更新的效果,结果负责C#编程的同事问我用的是什么方法,我说AJAX,然后很他有趣问我为什么页面中看不到AJAX的控件?我说没用什么控件,代码都写在Javascript文件里面,他愣了会说,原来AJAX还可以这样写的啊!?!?!所以童鞋们,别总是习惯于拖控件啊,不然做了几年程序员都不知道启用Asp.net回发会生成Javascript。扯远啦……

二. 页面状态不能持久可用

回发机制就是把一个表单post给服务器再根据表单值来呈现页面状态的过程,由于页面呈现需要根据post过来的表单值来判断,因此这个状态是无法以get请求通过URL来重现的,如果是网站,那么这不仅对于用户来说非常的不友好,对搜索引擎也不友好;这只是一个方面,当碰到网络不稳定或者服务器崩溃时页面没有被打开,当你刷新页面时噔的弹出一个警告询问您是否重新发送数据,您尚能开心否?这种情况下虽然可以通过重新发送数据得到界面,但是多此一举的提示让用户很反感,如果选择不发送数据时页面不会有任何响应,对于用户的心理简直就是一种摧残,我不就打开一网页吗,又没填写什么东西要问我发送什么数据?普通的用户谁知道你要发送什么数据,还以为你要窃取隐私呢!。

三. 无所不在的回发造成时间和资源浪费

启用ASP.NET的回发后,页面上的任何操作都会回发给服务器端处理,你能想象在网络资源并不充足的情况下,用户每做一点小小的操作都要等上几秒的感觉吗?
就算是B/S系统这样每次都提交大量的数据并重载页面也会极大的增加用户的等待时间,以及浪费服务器和带宽资源。用户等的时间越长用户体验越差,等的频率越大用户越抓狂,至于服务器和带宽那是你的,只要有钱多买便是,电信和硬件商会很Happy的。

有时间的话考虑一下怎么避免回发吧,不详叙了。