前言
某人曾说,没写过控件的程序员不是真正的程序员。听到这话我眼都绿了,原来混了这么些年才发现自己原来是一个假冒伪劣的程序员。看这阵势非得把程序员分个三六九等才行,个人卑见,大家都继承自程序员,只是实现了不同的接口而已,哈哈!其实好在我不是正宗程序员,只是实现了程序员接口而已。呵呵,开个玩笑,这个某人的意思是开发控件会让你对程序理解得更透彻。
我写过控件,不过没用C#写过,更没有开发过Web控件。没办法,这年头B/S更流行,咱也不能落后。关于ASP.NET控件开发的书国内和国外都比较少,比较出名的有一本《Professional ASP.NET 2.0 Server Control and Component Development》。现在已有中文版卖了,本想买一本,但评论说翻译得不是很好,百来块银子,舍不得啊!还是直接看英文版的吧。已看了第一章的一半,感觉很不错,只是有些地方交待得不是很清楚,第一个例子楞是没做出来,这不是打击我这初学者的信心吗?好在我发扬了不怕苦不怕累的精神,到处查阅资料,翻MSDN文档,终于把它给弄出来了。看来关键时刻,还是得靠MSDN!准备在学习的过程中把所得写成文章做为学习笔记,供日后参考,也希望大家能指出其中错误,共同讨论,共同进步嘛!
第一回 Hello World
开篇有益,先弄个例子让大家找到成就感。按照国际惯例,第一个例子都是Hello World,所以这次我们也做一个HelloWorld。当然,用ASP.NET进行开发首先需要配置IIS,弄一个虚拟目录,如果这个不清楚,请查阅ASP.NET的入门书籍。弄好后,先做个测试。在虚拟目录(这里假设虚拟目录名称为“ASP”)下新建一文件,改名为:HelloWorldPage.aspx。用记事本打开它,在其中输入如下代码:
例1-1:HelloWorldPage.aspx代码
<body>
<a href="http://cgbluesky.blog.163.com" target=_blank>HelloWorld!</a>
</body>
</html>
保存文件,在【我的电脑】上右击鼠标,选中菜单中的【管理】打开【计算机管理】对话框,展开【服务和应用程序】节点下的【Internet信息服务】,看见【网站】文件夹了吧?展开它,再展开【默认网站】,然后选中你建的那个虚拟目录,在窗口右边可以看到我们刚才所建的HelloWorldPage.aspx文件,右击它,在菜单中单击【浏览】菜单,如图1-1所示(注意,不要被图迷惑,你那的虚拟目录下只有一个文件)。这时,会自动打开浏览器并进行这个aspx文件。当然,您也可以在浏览器地址栏中直接输入现在所看到地址打开文件。
运行后,可以在浏览器中看到左上角的“Hello World!”它还带着下划线,单击可以跳到另一个网页。好!接下来我们把这个带链接功能的Hello World做成控件。
在虚拟目录中新建一名为“FirstControl.ascx”的文件,用记事本打开,并在其中输入如下代码:
例1-2代码1:FirstControl.ascx代码
<a href="http://cgbluesky.blog.163.com" target=_blank>HelloWorld!</a>
哈哈,控件制作完成,就这么简单,第一行的Control表示这是一控件,下面一行则是直接Copy例1-1的中间那行代码。下面就可以在aspx文件中调用这个控件了。
在虚拟目录中新建一名为“FirstHelloWorld.aspx”的文件,用记事本打开,输入如下代码:
例1-2代码2:FirstHelloWorld.aspx代码
<html>
<body>
下面是我的第一个控件:<br />
<form runat="server">
<MyControl:SimpleControl runat="server" />
</form>
</body>
</html>
第一行代码用于注册控件,TagPrefix表示控件组集合名,TagName表示控件名称,src表示这个控件所在文件的名称。文本控件大家都用过吧?语法<asp:textbox />中的asp就是TagPrefix,textbox就是TagName。我们使用自己的控件也使用同样的方式:
<MyControl:SimpleControl runat="server" />
这一句表示在网页的某个位置调用我们刚才做的控件。好,在浏览器中运行FirstHelloWorld.aspx文件,看看运行效果,是不是跟例1的一样?只不过这次使用了控件。
恭喜!终于完成了第一个控件,这可是一个好的开始。这时大家可能要问了,这只是把aspx文件中的一部份代码转移到另一个文件而已,而且这代码是可见的,我要是不想让别人看见我的代码该怎么办呢?能不能把控件做成DLL啊?
No Problem!这就是我们要讲的自定义控件。实现一个自定义控件,需要继承C#中的一个类来编写,也就是说,自定义控件需要完全使用C#语言来实现。下面我们来做一个HelloWorld的自定义控件:
新建一个名为“SecondControl.cs”的文件,用记事本打开,输入代码如下:
例1-3代码1:SecondControl.cs代码
using System.Web.UI;
namespace MyControl
{
public class SimpleControl:Control
{
protected override void Render(HtmlTextWriter writer)
{
writer.Write("<a href='http://cgbluesky.blog.163.com' target=_blank>HelloWorld!</a>");
}
}
}
这里新建了一个类,它继承自Control。我们可以把Control类想象成一个机器,它可以按照我们的意思生产出HTML代码给浏览器,然后浏览器会把这些HTML代码转换成我们看得到的网页。
当然,Control中最重要的一个方法就是Render,我们需要重写这个方法来控制控件所输出的HTML。在这个方法中,调用了参数writer的Write方法来向客户端写HTML。这里其实很简单,把例1-1中的中间那句代码拷贝过来就行了,当然还要在两边加上双引号,HTML代码中的双引号改为单引号。
接下来把它编译成DLL文件,如果不知道如果使用DOS命令编译DLL请先参考:
http://www.enet.com.cn/eschool/video/c/1.shtml 和http://www.enet.com.cn/eschool/video/c/4.shtml
DLL文件需要放在虚拟目录根目录下的bin文件夹内。首先新建一个bin文件夹。为了使用编译舒服些,我们使用批处理。接下来新建一个“CompileSecondControl.bat”文件,用记事本打开,并输入代码如下:
例1-3代码2:CompileSecondControl.bat代码
set outdir=H:\ASP\bin\SecondControl.dll
csc /t:library /out:%outdir% %indir%
pause
这里不能全盘拷贝,indir参数和outdir参数后面的路径需要根据您自己的实际情况来确定,indir是SecondControl.cs这个源文件所在路径,outdir是DLL文件的输出路径,当然也就是刚刚建的虚拟目录下的bin文件夹。
双击这个批处理文件,执行程序的编译,成功后检查bin目录是否多了一个SecondControl.dll文件。接下编写aspx文件来使用这个DLL,新建一“SecondHelloWorld.aspx”文件,用记事本打开并输入如下代码:
例1-3代码3:SecondHelloWorld.aspx代码
<html>
<body>
<CG:SimpleControl runat="server" />
</body>
</html>
第一行代码跟“例1-2代码2”的第一行很相似,都是注册一个控件,惟一不同的地方在于最后一个属性,这里使用了Assembly,表示这个控件存在于一个程序集(DLL)之中。而服务器会在虚拟目录中的bin文件夹下寻找这DLL。SecondControl代码的就是程序集的不带后缀名的文件名。
现在在浏览器中运行SecondHelloWorld.aspx,我们得到了和之前一个的运行结果,但这是次使用的是自定义控件。现在你在浏览器【查看】菜单下选择【查看源文件】。看看里面的HTML代码,然后跟“例1-3代码3”的代码进行比较,回想我刚才说的控件就是一生产HTML的机器,现在您应该领悟些什么了吧?
这时您可能会问了,这样编译DLL文件很麻烦啊,写个程序要调试很多次,每次都要编译DLL太累!有没有什么方法可以把控件写好了,调试好了再编译成DLL啊?
欲知详情如何,请听下回分解。