ASP.NET 3.5系统开发精髓
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 一个简单计算器的实现

本节的目的是通过一个实例的练习,使读者对ASP.NET编程机制有一个整体的认识。实例虽然简单,却包含了基本的ASP.NET编程技术。

例2-1:实现一个简单的加法计算器。

步骤1 打开例1-2中建立的解决方案文件“学习ASP.NET.sln”,进入VS后,双击Default.aspx,在编辑区选择拆分模式。编辑区左上方有一个“工具箱”的滑动面板,拖入三个TextBox控件、两个Label控件和一个Button控件,组成如图2-1所示的界面。

图2-1 计算器设计界面

Default.aspx源的内容如下:

      <%@ Page Language="C#" AutoEventWireup="False" CodeFile="Default.aspx.cs"
  Inherits="_Default" %>
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head runat="server">
          <title>无标题页</title>
      </head>
      <body>
          <form id="form1" runat="server">
          <div>
              <asp:TextBox ID="TextBox1" runat="server" Width="80px" Text="1"
                  AutoPostBack="True"
  ontextchanged="TextBox1_TextChanged"></asp:TextBox>
              <asp:Label ID="Label1" runat="server" Text="+"></asp:Label>
              <asp:TextBox ID="TextBox2" runat="server"
  Width="80px"></asp:TextBox>
              <asp:Label ID="Label2" runat="server" Text="="></asp:Label>
              <asp:TextBox ID="TextBox3" runat="server" Width="80px"
  Enabled="False"></asp:TextBox>
              <br />
              <asp:Button ID="Button1" runat="server" Text="求和"
  onclick="Button1_Click" />
          </div>
          </form>
      </body>
      </html>

加粗部分代码就是从工具箱面板拖入页面的控件定义代码,以TextBox为例,如:

      <asp:TextBox ID="TextBox1" runat="server" Width="80px"></asp:TextBox>

其中“ID”、“runat”、“Width”都对应着该控件的属性页相应的属性(选中控件后,在如图2-1所示的右下方的属性窗口中会列出该控件的可编辑属性)。

注意,这些aspx源中服务器控件的描述代码并不是标准的HTML标记(tag),而是ASP.NET中定义的服务器控件的“扩展标记”,所以以上aspx页面中的代码只能称为“aspx源”。

只看图2-1所示的界面是不能够准确地指出各个控件的各项属性,只有上面所示的代码才能准确地标明各控件的属性。因此在本书后面的举例中,尽量少用界面图片,而多用如上所示的aspx页面源码来说明各控件的状态,读者可根据各控件的属性自行进行设置。要注意这些代码一定要位于<form>表单之内,因为ASP.NET要通过form表单向服务器传递数据。如:

      <form id="form1" runat="server">
      ……(上面所示代码)……
      </form>

步骤2 在aspx的“源”中,将光标处于Button按钮的定义代码。

      <asp:Button ID="Button1" runat="server" Text="求和" />

“属性”面板自动显示Button的属性,选择属性面板上的“事件”页(闪电图标)。双击“Click”事件项,自动会在Default.aspx.cs文件中创建一个名为“Button1_Click”的方法,有Windows编程经验的读者应该很熟悉这个方法的作用。

按照习惯的方式,添加一个Click事件,最快捷的方式是在设计图形界面上,双击按钮即可;但本书建议尽量少用图形界面,多用aspx源,这样既提高了编程效率,也便于书中的讲解。aspx源中Button按钮的定义代码已变成:

      <asp:Button ID="Button1" runat="server" Text="求和" onclick="Button1_Click"/>

在Default.aspx.cs文件的“Button1_Click”方法中写如下代码:

          protected void Button1_Click(object sender, EventArgs e)
          {
              double a = double.Parse(this.TextBox1.Text);
              double b = double.Parse(this.TextBox2.Text);
              double c = a + b;
              this.TextBox3.Text = c.ToString();
          }

步骤3 在解决方案资源管理器中网站条目“E:\学习ASP.NET\Calculator\”(如图2-2所示)上单击右键,选择快键菜单上的第一项“生成网站”,编辑器的左下角状态栏会出现生成网站的过程指示信息,直至出现“生成成功”。这个过程有点类似于C/C++语言的编译和链接过程。

图2-2 生成网站

步骤4 在解决方案资源管理器的“Default.aspx”项上单击右键,选择快捷菜单中的“在浏览器中查看”(以下简称为“浏览Default.aspx”)选项,如图2-3所示。实际上可以忽略第三步,直接进行第四步,系统会自动进行第三步的“生成网站”。

图2-3 在浏览器中查看(运行)aspx页面

在浏览器中可以输入数字进行测试,由于程序中使用的是double类型,因此可以输入小数;但输入字符时会出错,因为double.Parse()方法不支持字符,读者可以加上“try-catch”语句块捕捉错误,“try-catch”是C#语法。其语法结构如下:

      protected void Button1_Click(object sender, EventArgs e)
      {
          double a, b, c;
          try
          {
              a = double.Parse(this.TextBox1.Text);
              b = double.Parse(this.TextBox2.Text);
          }
          catch   //如果出错则执行此段程序
          {
              Response.Write("只能输入数字");   //在页面上输出文字
              return;     //不再往下执行,Click事件执行完毕
          }
          c = a + b;
          this.TextBox3.Text = c.ToString();
      }

程序解释

(1)this.TextBox1.Text。其中的this表示引用当前类,是C#的关键字;this.TextBox1指当前类中定义的ID为“TextBox1”对象,可以不用this,直接写成TextBox1.Text;前面加this是一个习惯,以能够准确的指出TextBox1是在哪里定义的。如在此方法里,用户又定义了一个名为“TextBox1”的变量,this.TextBox1就表示不是方法中定义的那个变量,而是当前类中定义的TextBox1对象。Text是文本框对象的一个属性,记录着文本框中的值。

(2)Response.Write(“只能输入数字”)。Response是ASP.NET基础类库中的一个重要类HttpResponse所生成的对象。Response对象是向浏览器输送相关内容,Response.Write()方法就是向浏览器输送一串字符,此方法在.NET中的作用与C语言中的Printf()函数类似,可便捷地显示一些程序结果。

(3)try-catch语句是C#中捕捉错误的机制。在try{…}中所包含的代码如果出错,程序不会立即停止并由系统报错,而是跳到catch{…}处开始执行。