读书一般先看目录,并且习惯性的从第三章开始看,除了胡百敬老师的书和代码大全外,其他见过的中文技术书籍无论是自己撰写的还是翻译的都清一色的在前两章添加N多基础知识,不管讲的好不好,第一次看一本书从第三章开始看都成了习惯。

同其他讲解asp.net的书一样,第三章是从控件开始讲起的,但是读罢此章,作者描述问题的思路和译者的翻译确实让我迷惑了很多,继续看完后面的章节,感觉作者刚下笔实在是太紧张,而且太想把asp.net介绍给一个从来没有接触过web开发的朋友了。

我们从另一个角度还看asp.net中的几种控件:asp.net server control, html server control, html control。

asp.net server control是最基础的asp.net组件,本书也使用了6章来介绍了常用的控件、2.0的新控件和控件开发的知识。而html的两种control和asp.net server control之间的关系如何理解呢?最简单的就是站在一个最高的角度来看——看它们最终在呈现到客户端浏览器的时候是什么。我们用下面这个很简单场景来看一下:

假设我们要用户输入用户名,点击提交按钮后服务器根据用户名从服务器获得用户的年龄然后显示在页面上。我们拖放上一个Textbox和一个Button,再放置并配置好一个验证控件就ok了。当我们使用验证控件的时候,asp.net会将起使用span标记和一堆控制样式的属性将*呈现到页面上,而运行机制是用脚本控制的,这些脚本会自动根据用户的浏览器将适合该浏览器的代码一起发送到客户端上。

这时候我们运行这个页面,看其source code,很容易看出asp.net server button control就是一个type为submit的html input control。这时候我们再放置一个html control的button控件,然后将其属性加上runat="server",再运行,然后看源代码,就可以看到他被render成一个type为button的html input control了。这时候点击两个控件中的任何一个都会造成页面提交(如果验证控件验证通过的话),作为submit的asp.net server control很容易理解为什么被会引发提交,那么html server control呢?是因为它调用的脚本里有__doPostBack('Button2',''),而页面里的__doPostBack()函数使得页面提交了。而加入了验证控件后,两者再提交前都是需要做数据检查的,使用的都是脚本来验证是否可以提交页面数据,但是方式是截然不同的:

<input type="submit" name="Button1" value="Button" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;Button1&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="Button1" />

<input language="javascript" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(''); __doPostBack('Button2','')" name="Button2" type="button" id="Button2" value="button" />

<span id="RequiredFieldValidator1" style="color:Red;visibility:hidden;">Please enter your username</span>

这时我们可以看到嵌入资源文件的脚本这样被使用了,但是如果想知道这些方法具体做了些什么可以借助fiddler、httpwatch或firebug这样的工具来看,不过最快捷的办法是在浏览器的地址栏敲入javascript:js_method_name来查看。比如javascript:WebForm_DoPostBackWithOptions就能看到该方法的内容了。

好,我们刚才从结果上入手,算是比较深入的看到了结果和客户端页面执行的过程,这时我们不妨再跳出来,重新审视一下这个过程:我们需要的是用户输入其username,然后我们根据该值从数据库里取出对应的年龄并显示在页面上,那么整个过程应该是用户数据姓名提交,服务器得到用户名,然后将年龄得到,返回给客户端。抛开http的信息来回传递的信息应该只有username和age,但是看看我们现在,是否传送了太多无用的数据?

那我们简化一下流程:我们全部使用html control来做,分别放置一个type为button和text的input控件,当button被点击时执行一个javascript function检验text里是否有字符然后将其发送到服务器,比如通过调用服务器段的一个web service,这个web服务在验证数据后将数据从database中取出,返回到客户端,在接受到数据后脚本将其呈现在页面上。

需要注意的是数据在客户端的验证是不可信的,通常情况下大多数浏览器通过地址栏就可以任意修改页面元素的值,所以在服务器做判断是必须要的。

这时候我们看两个过程简直是天壤之别,但是在开发效率和后期维护上也是天壤之别的。asp.net server control如果用不好,造成的后果就是灾难了。

看完此章的朋友们再看完了这篇抛的“砖”,然后将一个<asp:Button..../>中的runat="server"去掉,看看是什么结果?思考一下html被浏览器的解释是否能更清晰的认识到Control这个词呢?

posted on 2007-03-12 04:33  维生素C.NET  阅读(2359)  评论(7编辑  收藏  举报