VB.NET开发互联网应用
作者:刘彦青
尽管在Visual Basic 6中也有一些有关互联网功能的组件,例如WebClasses、Winsock和 WebBrowser控制,但也仅此而已,它再也没有其他更令人激动的功能了。尤其是WebClasses,更象是后来添上去的,简直可以说是没有一点用处。
但在VB.NET中,网络功能则扮演着重要的角色。首先,VB.NET中有Web Services,它将是DCOM的取代者。其次,VB.NET中还有Web Forms。Web Forms可以使用户无需使用古老的ASP或者CGI就能有效地建立全交互的互联网网站。(仅仅是理论上是如此,我并不希望你真的这样作。)
理论
在介绍Web Forms的具体细节之前,让我们先抽出一点时间来介绍一些理论方面的基础知识。
那么我们现在使用的互联网开发工具有什么不足之处呢?对于任何比较重要的开发活动,一般都需要用到ASP,但我必须说明的是,我并不喜欢它。
首先,它会使我们所编写的代码显得凌乱。我们必须将表示层(实际的HTML代码)与ASP代码混在一块儿。我们应该将所有代码都隐藏在窗体的后面,尽管有几种方法能够解决这一问题,但并不是十分理想。
其次,必须浪费时间对所有使用老式计算机的用户提供支持,如果这些用户的浏览器不支持JavaScript,我们就需要发现这一问题,并通过修改网页,满足用户的需求。
此外,还存在状态管理问题。如果有人登录了网站,而我们希望知道有关它的基本情况,就需要使用Session对象。当有多台机器需要访问Session对象时,网站的负荷就会很大,这时我们又会遇上麻烦。
令人不可思议的是,VB.NET中的Web Forms将能够使所有这些问题迎刃而解。Web Forms是全新的ASP.NET(不再是ASP+),它们可以使用我们在VB.NET中有效地创建交互式互联网网页,而且这一工作还非常地轻松。
我们只要简单地在VB.NET中创建一个Web Form即可。这一过程与设计一个WebClass有点类似,但令人遗憾的是,我们只能在FrontPage中设计好网页,然后把生成的HTML代码传送给VB.NET中的Web Form。
提示:尽管可以将在FrontPage中生成的HTML代码传送给VB.NET中的Web Form,但这与事实有一定的出入。在我的多次试验中,似乎在网页比较简单时没有什么问题,但如果网页的输出变得复杂时,就会出错。在以后的版本中这一问题应该得到修正。
因此,我们可以通过Web Form创建基本的网页,然后在VB.NET中添加交互性元素━━例如文字框或提交按钮,此外,还可以在其中添加不需要进行独立下载的更高级的HTML功能━━Web Controls。这样设计出来的网页可以兼容所有的浏览器。
提示:VB.NET中捆绑有许多Web Controls,例如,我们在稍后会使用到的Calendar控制。
在设计出网页和添加上交互性元素后,还需要再添加一些代码使得二者能够更好地融合在一块儿。也就是说,我们在Web Form上有了一个文本框和按钮,但还需要编写一段代码,获得在文本框中输入的数据并在标签中显示它,或者把它添加到数据库中、或者在一个用户列表中进行校验,然后把用户定期导向到成员区中。
这里的关健问题是我们可以将整个网页和对象当作一个对象来处理。你再也无需象在原来的ASP中那样请求一些窗体字段,而只需象在Windows Form中那样调用对象即可。
在把ASP.NET与ASP进行比较后,我们再来看看我在上面提出的问题,并找出如何解决它们的办法。
首先,是HTML、ASP代码混用的问题。在VB.NET中不会遇到这一问题,HTML网页与所使用的代码是完全分离的,在Web Form上只有一行代码与所使用的代码模块有关,其他的工作有互联网服务器来完成。
提示:象ASP文件有.ASP后缀那样,Web Forms有一个.ASPX后缀。当互联网服务器向用户提交这一网页时,.NET Framework首先自动地对它进行处理,例如,Web Controls被转换为HTML代码,编译代码等,我们在后面会更详细地谈到这一问题。
第二,使用原来的ASP,我们必须在检查用户的浏览器并对内容进行适当的修改使它的兼容性更好方面花费一定的时间。在VB.NET中,它可以为我们完成所有的处理,.NET Framework只能产生可以被目标浏览器所识别的HTML代码。
那么状态管理如何呢?对于大多数的ASP开发人员而言,这都是个难以处理的问题。在ASP.NET中,状态是被存储在发给用户的网页中的(以一种隐藏字段的方式。)。在下次再发送该网页时,就可以读取和使用其中的数据。
提示之一:我们可以把ASP.NET中的状态管理认为与使用Property Bags类似,它会自动地在Property Bags中添加信息,例如文本框信息。此外,我们还可以自己添加相关的信息,然后再使用它们。
提示之二:测试表明,与传统的ASP中的Session对象相比,使用这种状态管理的方法在性能上有较大的提升。
提示之三:安全仍然是个问题,数据编码的标准化程度非常高,如果在实际的操作中需要真正有效的安全,还需要根据具体的情况,将状态管理与现有的数据库口令记录等类似的东西结合起来。
好了,这就是ASP.NET,它是一种崭新的工具,它所提供的功能是ASP开发人员所梦寐以求的。如果你使用Visual Basic作为开发工具,并希望涉足互联网应用开发,这将是一个理想的机会。
实例之一
ASP.NET应用开发是一件相当简单的事儿,为了说明这一点儿,我们把空洞的理论放到一边儿,首先来看一个实际的例子:
·启动VB.NET。
·创建一个新的Web应用。
图:Working the Web1
注意:其中的位置已经不再是文件路径,而是一个HTTP地址了,但也许是运行IIS的本地机器上的地址。在本例中,我在http://ABYDOS地址上创建了GroovyWeb工程,意味着我最终的工程地址是http://ABYDOS/GroovyWeb/。
在经过适当的处理后,就会出现WebForm1.aspx文件,计算机的屏幕应该显示如下所示的状态:
图:Working the Web2
现在,我们创建一个应用程序,它能够接受在文本框中的名字,并将该名字显示在窗体上的标签中。尽管这个应用程序很简单,但却展示了一种全新的理念。
·采用拖放方式在Web Form上创建Label、TextBox和Button,如果有可能,将它们布置在不同的行上。
提示:需要注意的是,在设计时不能象在Win Forms中那样将一个控制拖出窗体。但这并不会影响到对控制的其他操作,我们仍然可以通过Properties窗口修改名字和风格等相关的属性。
生成的窗体应当如下图所示:
图:Working the Web3
在添加代码前,我们可以首先来通览组成我们刚生成的网页的HTML代码:
·通过点击窗体底部合适的按钮,将Web Form模式由Design改为HTML。
图:Working the Web4
我们首先来看第一行用黄色高亮度显示的代码,它说明.ASPX网页代码的存储地址,在本例中是Codebehind=“WebForm1.vb”,随后我们还会看到这一文件。
象标签、文本框等这些我们以往都使用HTML代码定义的控制现在都有了 标记,这也正是这些控制能够被识别为ASP.NET控制的原因。
提示:即使它们都带有标记,在发送给浏览器之前,这些控制也会被转换为正常的HTML代码。
其中大多数代码与正常的HTML代码类似,如果以前对HTML比较熟悉,应该能够毫不费力地理解它们。
·返回到Design模式。
好了,下面我们在工程中添加一些代码。
·双击窗体上的按钮
我们将看到Web Form代码窗口。一些预先生成的代码会使你感到困惑,其中一些是非常有用的,例如Load事件的代码。
·输入下面的代码:
当我第一次这么作的时候,感到非常的不安,这是因为在正常的Visual Basic应用中书写ASP和CGI等代码的原因。
好了,下面让我来给你一个小惊喜。
·击F5键“运行”新生成的互联网网页。
提示:在我按F5键后,我看到了一条有关安全权限设置不恰当的信息,这一信息是错误的,安全权限的设置一切正常。如果你也碰到了这一问题,可以简单地点击OK按钮,别理它。然后运行IE,并访问新生成的网页,在本例中,网页的地址为http://ABYDOS/GroovyWeb/WebForm1.aspx。
第一次运行时可能需要几秒钟进行加载,原因是互联网服务器需要对代码进行编译,在网页第一次被访问时,它会自动进行这一处理。如果网页有所变化,则还需要再次进行编译,当然,这也是自动进行的。
·输入你喜欢的Web Form上的颜色,然后点击那个按钮。
图:Working the Web6
几乎是同时,窗体就能够接收到数据并进行适当的处理,窗体会变成如下所示:
图:Working the Web7
哇!仅仅通过一行代码,我们就完成了一个ASP开发人员需要好长时间才能完成的工作。
提示:看一下网页的源代码(点击View->Source)。注意一下隐藏的__VIEWSTATE字段,这是我刚才调用时产生的编码数据,现在,它包含有控制的值等一些信息。随着完成的复杂操作越来越多,它的尺寸也会不断增长,但性能仍然会优于以前的使用Session对象的方法。
好了,至此我们已经完成一个非常简单的例子,下面我们再通过一个比较复杂的例子来学习Web控制和Web Form事件。
实例之二
下面我们将创建一个网页让用户与他的医生预约一次见面。他们只要输入姓名并选择一个日期,如果遗漏了姓名,就会得到一个出错信息。我们再来添加一个新的Web Form:
·添加一个Web Form。(依次选择Project->Add Web Form,并使用缺省的WebForm2.aspx名字。)
然后,我们将修改现有的网页,使它与新的工程连接起来。
·重新回到WebForm1.aspx。
·在Web Form上添加一个CheckBox控制。
·将其Text属性改为:Move baby move!。
缺省情况下,在点击CheckBox时,该网页不会被送回到服务器进行处理,但为了证明它能够被处理(同时也为了巧妙地说明另一个概念)我们可以覆盖掉这一缺省的操作。
·将AutoPostBack属性的值改为:True。
图:Working the Web8
现在我们来添加一些代码,在CheckBox被点击时对网页进行重定向。
·双击WebForm1.aspx上的CheckBox。
·输入下面的代码:
Navigate("WebForm2.aspx")
提示:如果不使用Navigate关健字,我们也可以使用与ASP格式类似的Response.Redirect("WebForm2.aspx")。这是因为我们仍然可以使用Response、Server 、Request、Session和Application等对象。当然,如果有时间,你也可以再试试ClientTarget、ErrorPage、IsValid、User和Validators等关健字。
现在我们来设计WebForm2.aspx:
·返回到WebForm2.aspx。
·在Form窗口中输入Name -
·在Name之后用拖放方式添加一个TextBox控制。
·在下一行上输入:Pick a date -
·在所有控制的下方添加Button控制。
·把Button控制的Text属性改变为:Make Appointment。
然后,我们将添加一个控制,检查TextBox中是否包含一个姓名,如果没有包含姓名,这个控制将变为可见的,并显示“raises an error”的出错信息。
·最后,在Form的底部添加RequiredFieldValidator控制。
·将Validator的ErrorMessage属性改为:Oi, u forget ur name!。
·将Validator的ControlToValidate属性改为:TextBox1。
我们设计的Form应当如下所示:
图:Working the Web9
现在,我们再添加“Make Appointment”按钮的一些代码:
·为按钮添加如下所示的代码:
Button1.Text = "Appointment for " & TextBox1.Text & " booked on " & Calendar1.SelectedDate
就是这么简单,通过简单的几步,我们就建立了一个要求用户输入姓名(如果没有输入姓名,就会显示出错信息。)并选择日期的应用程序,当点击“Make Appointment”时,Text就会验证输入的数据。
提示:可以通过使用IsValid属性检查控制确认是否已经成功。
·击F5键对设计的网页进行测试。
我们来检查一下我们的设计。首先,检查WebForm1.aspx、WebForm2.aspx上的文本框,并试着在没有输入姓名的情况下点击按钮。然后输入姓名并选择一个日期,注意Calendar互联网控制是如何自动处理这些事情的,然后,点击Button,看看你的成果吧。
提示:如果CheckBox不进行重定向,WebForm2.aspx就会发生问题。当我直接访问网页时,就会收到“Invalid Base Class”的错误信息。我发现解决这一问题的方法是在VB.NET中编译网页,这似乎是一种常见问题。
当然,我们还可以在Button的代码中执行其他任意的操作。在数据库中添加用户细节,根据用户的输入获得资料,验证用户的资料并进行登录。
结论
在本篇文章中,我们主要探讨了Web Forms的使用问题。首先,从理论上说明了它的工作原理,然后再使用Web控制创建了二个交互式网页
……