现在的位置: 首页 > 综合 > 正文

后台动态创建控件随感

2013年10月26日 ⁄ 综合 ⁄ 共 1094字 ⁄ 字号 评论关闭
前些日子由于工作需要,不得不写了一段后台动态创建控件的代码。调试了许久,还是发现困惑重重,不得不对页面周期有所了解,呵呵。
    问题这样,以前我们写的一个多文件上传页面,现在客户说维护太过复杂,不够简洁。我们只有修改,当然实现多文件上传的方法很多,可以通过JavaScript或者Request.Files等等技术实现。但是以前的编写者是用动态创建写的。因而我也只有使用这种方法才能使修改量最小。凭我对动态创建的理解,只要在Init前在创建就行了,其他没有问题。可是后来发现原比我想象的困难。
    最后我查了些关于页面周期的资料,才明白页面是怎么提交回服务器的,又是怎么于客户端交互的。原来前台的form在Submit后,IIS将这个post请求交给.net,.net随即打开请求的源文件分析,然后得到一个初始的页面。我理解上最大的问题就在这个初始页面上,也许你通过动态创建了很多控件,但是这个页面上却什么都没有,原有控件的值也没有,一切都是页面的原来模样。然后.net在这个页面上处理post请求。其中很重要的一步就是用ViewState中的数据处理原始控件。这里有两点值得注意,一个是.net会直接忽略初始页面中根本不存在控件的信息。这也就是你在前台创建的控件后台不认的原因。另一点大家估计都知道,就是ViewState保存了所有的页面信息,如果你禁用了,后台将得不到前台的任何操作。
    后台代码的Init调用的位置介于初始化页面和处理ViewState数据之间,所以控件的动态创建都要在这里进行(其实只要在处理ViewState前就行,因为它会忽略没有创建的控件)。在这我犯了一个错误,我以为我动态创建的控件下一次post回来时都还在。其实我错了,动态控件的信息是还在,但是初始页面中并没有,.net在处理ViewState时,虽然其中有以前动态创建的控件信息,但页面中没有这个控件,照样忽略!我在这真的头都大了,大费周折才搞明白。网上这方面资料不多。
    到这我要阐述的问题算完了。还有一点小技巧和大家分享。呵呵,可能不算什么。其实我们有办法将前台的创建的控件让后台也认。.net不区分前后台控件,区分的只是我们的代码。如果我们在前台创建了一个控件,然后在后台Init中创建一个name相同的后台控件,那么在处理ViewState时照样可以获取这个前台控件的信息。这样我们将问题分解成很实用的两块:前台的控件创建和操作,和后台的控件初始化。这样一方面前台创建和操控控件都很容易,另外也不必为了创建一个控件而Post一次。这对于包含file控件的页面影响更大,何乐而不为?

抱歉!评论已关闭.