凌晨2点回来,给Rect做了个新feature,做了3个多小时。。。太tmd久了!
其实这个feature很简单,之前一直使用传统方法的ASP.NET初学者就可以胜任。
不用任何框架完全手写Ajax真是一件非常艺术和麻烦的事情啊。
下面仅以文字记录下这段艰辛的旅途,也为和我一样手写Ajax的人提供一点哪怕是思考的东西。
上面的图描述了我要做的工作,这是一个搜索的选项,我现在要做的是在分别change省的时候他们右边的学校和城市都能够局部刷新而不是和传统的ASP.NET一样刷新整个页面。然后在我点击查询的时候能够获取到我刚才设定的信息。
首先我是这样做的:假设这个页面叫做search.aspx,在html里我写上了一段公用的Javascript函数createXmlHttpRequest用来建立xmlHttpRequest。
然 后在province的onchange事件里写了一个函数,调用了createXmlHttpRequest,并用建立的xmlHttpRequest 向服务器发送了当前的province,然后在服务器端读取school.xml,并返回了所对应的学校。利用xmlHttpRequest取得了返回的 信息,然后利用javascript填充了school的dropDownList。同理,下面的省change的时候后面对应的城市信息也是这样局部刷 新的。
这时问题1就出现了:由于学校和城市的信息是在服务器返回信息后利用javascript在客户端做的,所以服务器并不知道这个变化,因此在点击查询的时候无法用school.selectedValue来获取学校或者是城市当前选择的值。
解决1 这样可以解决,在学校和城市的onchange事件中把当前选择的值发给服务器,让服务器记录下来,我用的是session记录,其他的当点击查询按钮再postback回去的时候就消失了。(在if (!IsPostback)里记录的session)
这下问题似乎解决了,其实不然,session的过期是需要时间的,这样当我们重新刷了页面,即使不选择任何条件做查询,返回的结果仍然是上次的结果,为什么?session没过期啊!仍然存着现在本该没有的值!这问题2已经出现了。
解决2 可 能有人会这样想,在 if (!IsPostback)外面清空下session不就完了吗?唉!这样就什么都查不了了。kkJ想错了啊。那怎么清空该清空的session呢?我是 这样做的,在客户端又写了一个javascript函数clearsession,在省变成"请选择"的时候一边清空后面的list一边向服务器发回一个 参数(学校的发回school,城市的发回city供服务器识别)告诉服务器该清空哪个session了。这样问题似乎又解决了。
可是。。。这样在单独设置查询条件的时候还可以work,但是当我同时选择这个两个查询条件的时候,问题3出现了。我们先用第一个的省和对应学校查询,查出结果了,然后呢再选择第二个省和对应的城市,这是的问题在于会在服务器端刚才在解决2里设置的清除session函数中把条件1的session清除了,结果变成了只用条件2查询。。。
解决3 这个可以这样解决,在清除自己的条件对应的session的时候先判断一下另外的一个条件在问题1中传过来的参数是不是为空,为空了再清除session。
千万不要以为这样就好了啊。。。万恶的小峰在本页面加载的时候利用OnPreRender函数给查询的按钮加了参数为null的onClick属性,问题4出现了,这就是说在页面加载的时候那个session依然会起作用,而在页面重新加载的时候是不需要任何参数的。
解决4,无奈之下,虽然增加了代码量,但是谁让现在的计算机计算能力这么强呢!重新为它写了一个写了一个获取查询条件的函数,把值都设置为无了。这样就好了。
基本上大的问题就这四个了,其中还有一些小的问题,忽略不计了!
靠!VS2003真tmd老了啊!改日有空把项目开发环境升级到VS2005,再也不要忍受这种利用VS2003开发Ajax应用的煎熬了啊!!!!
人家写好的框架干嘛不用。。。
