** 在 ** ** ASP.NET ** ** 中实现 ** ** Model-View-Controller ** ** 模式(一) ** ** **
** 背景 ** ** : **
当利用 ASP.NET 创建 Web 应用程序时,基于程序的复杂性,必须把程序分割成不同的部分以减少代码的重复及减少日后变革时所引起的改动。
** 实现策略: ** ** **
为了解释如何在 ASP.NET 中实现( MVC )模型 - 视图 - 控制器模式,以及说明将软件分离成模型、视图、及控制器角色的好处,在此以一个示例程序为例进行说明。这个示例程序是一个带有下拉框的单页程序,它的功能是显示数据库中的数据。如下图。

当用户在下拉框中选择了一个记录,并单击 Submit 按钮的时候,程序从数据库中搜索与选中记录相关的数据库记录,并以列表的形式显示出来。下面,将以三种不同的实现方式进行实现。
** 单页模式 ** ** **
在 ASP.NET 中有许多解决这个问题的办法,其中最简单也是最直接的办法就是把所有的代码都放到一个文件中,并起名为 Solution.aspx, 实现代码如下:
1@ Import Namespace="System.Data"
1@ Import Namespace="System.Data.SqlClient"
1<html>
2<head>
3<title>start</title>
4<script language="c#" runat="server">
5
6void Page_Load( object sender, System.EventArgs e)
7
8{
9
10String selectCmd = "select * from Recording";
11
12SqlConnection myConnection =
13
14new SqlConnection(
15
16"server=(local);database=recordings;Trusted_Connection=yes");
17
18SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd,
19
20myConnection);
21
22DataSet ds = new DataSet();
23
24myCommand.Fill(ds, "Recording");
25
26recordingSelect.DataSource = ds;
27
28recordingSelect.DataTextField = "title";
29
30recordingSelect.DataValueField = "id";
31
32recordingSelect.DataBind();
33
34}
35
36void SubmitBtn_Click(Object sender, EventArgs e)
37
38{
39
40String selectCmd =
41
42String.Format(
43
44"select * from Track where recordingId = {0} order by id",
45
46( string )recordingSelect.SelectedItem.Value);
47
48SqlConnection myConnection =
49
50new SqlConnection(
51
52"server=(local);database=recordings;Trusted_Connection=yes");
53
54SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd,
55
56myConnection);
57
58DataSet ds = new DataSet();
59
60myCommand.Fill(ds, "Track");
61
62MyDataGrid.DataSource = ds;
63
64MyDataGrid.DataBind();
65
66}
67
68</script>
69</head>
70<body>
71<form id="start" method="post" runat="server">
72<h3>Recordings</h3>
73
74Select a Recording:<br/>
75<asp:dropdownlist id="recordingSelect" runat="server"></asp:dropdownlist>
76<asp:button onclick="SubmitBtn_Click" runat="server" text="Submit"></asp:button>
77<p></p>
78<asp:datagrid backcolor="#ccccff" bordercolor="black" cellpadding="3" cellspacing="0" enableviewstate="false" font-name="Verdana" font-size=" 8pt " headerstyle-backcolor="#aaaadd" id="MyDataGrid" runat="server" showfooter="false" width="700"></asp:datagrid>
79</form>
80</body>
81</html>
这个实现文件包含了模型、视图、控制器这三种角色,但是没有将它们分割为不同的文件或类。其中的视图对象用 HTML 实现,用一个数据绑定控件来显示从数据库返回的 DataSet 中的数据。模型角色在 Page_Load 和 SubmitBtn_Click 函数中实现。而控制器角色并没有显式的实现,而是由 ASP.NET 隐式实现。程序运行时,当用户发出页面的请求,页面随着用户的选择更新。