65.9K
CodeProject 正在变化。 阅读更多。
Home

摘自 ASP.NET MVC 框架

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.55/5 (4投票s)

2009 年 7 月 30 日

CPOL

25分钟阅读

viewsIcon

36458

本章为您提供了 Microsoft ASP.NET MVC 框架的概述和介绍。本章的目标是解释为什么您应该使用 ASP.NET MVC 构建 Web 应用程序

ShowCover.jpg 作者:Stephen Walther
由Sams出版
ISBN-10: 0-672-32998-0
ISBN-13: 978-0-672-32998-2

本章内容

  • 一个带有寓意的故事
  • 什么是好软件?
  • 什么是 ASP.NET MVC?
  • ASP.NET MVC 应用程序的架构
  • 理解示例 ASP.NET MVC 应用程序

“唯一不变的是变化。”
赫拉克利特

本章为您提供了 Microsoft ASP.NET MVC 框架的概述和介绍。本章的目标是解释为什么您应该使用 ASP.NET MVC 构建 Web 应用程序。

由于 ASP.NET MVC 框架旨在让您能够编写出优秀的软件应用程序,因此本章的第一部分致力于讨论优秀软件的本质。您将了解软件设计原则和模式,这些原则和模式使您能够构建出能够适应变化的软件。

最后,我们将讨论 ASP.NET MVC 应用程序的架构以及该架构如何使您能够编写优秀的软件应用程序。我们将为您概述 MVC 应用程序的不同部分,包括模型、视图和控制器,并向您介绍在创建新的 ASP.NET MVC 项目时获得的示例应用程序。

一个带有寓意的故事

我仍然记得有一天,我的经理来到我的办公室,让我构建一个“单一按钮应用程序”。他解释说,他需要一个简单的呼叫管理器应用程序,以帮助面试官在进行健康调查时拨打电话号码。呼叫管理器应用程序将加载一个电话号码列表,并在您按下按钮时逐一拨打每个号码。这还能更简单吗?

我非常认真和自信地说,我将在当天下午完成呼叫管理器应用程序。我关上办公室门,戴上我的牛仔帽,调高音乐,然后敲代码。到一天结束时,我已经完成了应用程序。我的经理很高兴,那天晚上我带着完成了一天好工作的愉快心情回家了。

第二天早上,我的经理再次出现在我的办公室门口。我担心地问呼叫管理器应用程序是否有问题。他向我保证应用程序运行良好。事实上,他非常喜欢它,以至于他想让我再添加一个功能。他希望呼叫管理器应用程序在拨号时显示一个调查表。这样,调查答案就可以存储在数据库中。

我怀着英勇的决心,再次花了一天时间敲代码。到一天结束时,我已完成呼叫管理器的更新,并自豪地向经理展示了完成的应用程序。

我不会继续这个故事,因为任何以编写软件为生的人都知道这个故事的结局。故事永无止境。当一个软件项目诞生时,几乎不可能杀死它。软件应用程序需要不断地注入新功能、错误修复和性能增强。

被要求修改自己创建的软件是一种赞美。只有无用的软件才会停滞不前。当人们关心软件时,当软件被积极使用时,它会不断变化。

我不再在创建呼叫管理器应用程序的公司工作了。(我现在在微软的办公室里。)但我仍然在那家公司有朋友,偶尔会收到关于应用程序如何变化的报告。不用说,它已经变成了一个极其复杂的应用程序,支持不同的时区、复杂的呼叫规则和带图表的高级报告。它不再能被称为“单一按钮应用程序”了。

什么是好软件?

我从麻省理工学院研究生院退学,在互联网最早的时候创办了一家互联网公司。那时,建立一个网站是很困难的。这发生在 Active Server Pages 或 ASP.NET 等技术出现之前。(我们只有石刀。)将 HTML 表单的内容保存到数据库表中是一项重大成就。闪烁的文本是酷炫的极致。

当我第一次开始编写软件时,仅仅让软件做我想做的事情就是目标。在最短的时间内向网站添加尽可能多的功能是90年代竞争激烈的创业世界中生存的关键。我曾经睡在办公室的桌子下面。

在我的创业阶段,我会这样定义好软件

好软件是按您预期运行的软件。

如果我特别有抱负,我会担心性能。也许,如果我有多余的时间,我会给我的代码添加一两个注释。但说实话,归根结底,我成功的标准仅仅是软件能够正常工作。

在过去的 8 年里,我为波音、NASA、洛克希德·马丁和国家科学基金会等大型公司和组织提供培训和咨询。大型组织不是初创公司。在大型组织中,重点不是尽可能快地构建软件应用程序;重点是构建能够长期轻松维护的软件应用程序。

多年来,我对优秀软件的定义发生了实质性转变。当面对维护自己“怪物”的可怕前景时,我将优秀软件的定义改为:

好的软件是按你预期运行且易于修改的软件。

软件会随着时间而变化有很多原因。Michael Feathers 在其出色的著作《高效处理遗留代码》中提出了以下原因:

  1. 您可能需要向现有软件添加新功能。
  2. 您可能需要修复现有软件中的错误。
  3. 您可能需要优化现有软件。
  4. 您可能需要改进现有软件的设计。

例如,您可能需要向应用程序添加新功能。呼叫管理器应用程序最初是一个“单一按钮应用程序”。然而,每天都有越来越多的功能添加到应用程序中。

当您发现软件中的错误时,也需要更改软件。例如,在呼叫管理器的情况下,我们发现它没有正确计算夏令时。(它在早上吵醒了一些人!)我们匆忙地修改了损坏的代码。

您可能还需要修改软件应用程序,以使应用程序运行更快。曾几何时,呼叫管理器应用程序拨打一个新电话号码需要长达 12 秒。业务规则变得越来越复杂。我们不得不重写代码,将电话号码检索时间缩短到毫秒级。

最后,您可能需要修改软件以改进其设计。换句话说,您可能需要将编写不佳的代码转换为优秀的代码。您可能需要使您的代码更能适应变化。

避免代码异味

除非您小心,否则软件应用程序很快就会变得难以更改。我们都有过这样的经历:继承了别人编写的应用程序并被要求修改它。想想在您进行第一次更改之前,恐惧会如何攫住您的心。

在拾木棒的游戏中,您必须一根一根地从一堆木棒中取出木棒,而不能干扰其他木棒。稍微犯一点错误,整堆木棒可能就会散落。

修改现有软件应用程序类似于拾木棒游戏。您碰到错误的代码片段,就会引入一个错误。

糟糕的软件是难以更改的软件。Robert 和 Micah Martin 将糟糕软件的标志描述为“代码异味”。以下代码异味表明软件编写得很糟糕

  • 僵化——僵化软件是指在某个地方进行更改时,需要进行一系列连锁更改的软件。
  • 脆弱——脆弱软件是指在进行更改时,会在多个地方出现问题的软件。
  • 不必要的复杂性——不必要的复杂软件是指过度设计以处理任何可能变化的软件。
  • 不必要的重复——不必要的重复软件包含重复代码。
  • 不透明性——不透明软件难以理解。

注意

这些代码异味由 Micah 和 Robert Martin 在他们的书《C#敏捷原则、模式和实践》中描述。强烈推荐这本书!

请注意,这些代码异味都与变化有关。每个代码异味都是变化的障碍。

软件设计原则

软件不必写得糟糕。一个软件应用程序可以从一开始就设计成能够经受住变化。

使软件易于更改的最佳策略是使应用程序的组件“松耦合”。在松耦合的应用程序中,您可以更改应用程序的一个组件,而无需更改其他部分。

多年来,编写优秀软件的一些原则已经浮出水面。这些原则使您能够减少应用程序不同部分之间的依赖关系。这些软件原则已在 Robert Martin (AKA Uncle Bob) 的工作中汇集。

罗伯特·马丁并非发明了所有这些原则;然而,他是第一个将这些原则汇集成一个列表的人。以下是他的软件设计原则列表:

  • SRP——单一职责原则
  • OCP——开闭原则
  • LSP——里氏替换原则
  • ISP——接口隔离原则
  • DIP——依赖倒置原则

这组原则统称为 SOLID。(是的,SOLID 是一个由首字母缩略词组成的缩略词。)

例如,根据单一职责原则,一个类应该只有一个更改的理由。这是一个关于如何应用此原则的具体示例:如果您知道可能需要将应用程序的验证逻辑与数据访问逻辑分开修改,那么您不应该在同一个类中混合验证和数据访问逻辑。

注意

还有其他软件设计原则列表。例如,《Head First Design Patterns》一书有一个不错的列表。您还应该访问 C2.com 网站。

软件设计模式

软件设计模式代表了应用软件设计原则的策略。换句话说,软件设计原则是一个好主意,而软件设计模式是您用来实现这个好主意的工具。(它就是锤子。)

软件设计模式的理念最初由《设计模式:可复用面向对象软件的元素》一书推广。(这本书被称为“四人帮”书。)这本书启发了许多其他描述软件设计模式的书籍。

《Head First Design Pattern》一书以更友好的方式介绍了“四人帮”书中的设计模式。这本《Head First Design》书中专门用章节介绍了 14 种模式,名称如观察者、外观、单例和适配器。

另一本有影响力的软件设计模式书籍是 Martin Fowler 的《企业应用架构模式》。这本书有一个配套网站,列出了书中的模式:https://martinfowler.com.cn/eaaCatalog

软件设计模式为您提供了使代码更能适应变化的模式。例如,在本书的许多地方,我们利用了一种名为“Repository 模式”的软件设计模式。Eric Evans 在他的著作《领域驱动设计》中这样描述 Repository 模式:

“REPOSITORY 将所有特定类型的对象表示为一个概念集(通常是模拟的)。它像一个集合,但具有更复杂的查询能力。适当类型的对象被添加和移除,REPOSITORY 后面的机制将它们插入或从数据库中删除。”

根据埃文斯的说法,Repository 模式的主要优点之一是它使您能够“将应用程序和领域设计与持久化技术、多种数据库策略甚至多种数据源解耦”。换句话说,Repository 模式使您能够保护您的应用程序免受数据库访问方式变化的影响。

例如,当我们在本书末尾编写博客应用程序时,我们利用 Repository 模式将博客应用程序与特定的持久化技术隔离开来。博客应用程序的设计方式使我们可以在不同的数据访问技术之间切换,例如 LINQ to SQL、Entity Framework 甚至 NHibernate。

为您的代码编写单元测试

通过利用软件设计原则和模式,您可以构建更能适应变化的软件。软件设计模式是架构模式。它们关注应用程序的宏观架构。

如果您想在更细粒度的级别上使您的应用程序更能抵抗变化,那么您可以为您的应用程序构建单元测试。单元测试使您能够验证应用程序中的特定方法是否按预期工作。

为您的代码编写单元测试会带来许多好处

  1. 为您的代码构建测试为您提供了应对变化的“安全网”。
  2. 为您的代码构建测试迫使您编写松耦合代码。
  3. 为您的代码构建测试迫使您从用户角度看待代码。

首先,单元测试为您提供了应对变化的“安全网”。这是 Michael Feathers 在其著作《高效处理遗留代码》中反复强调的一点。事实上,他将遗留代码定义为“仅仅是没有测试的代码”。

当您的应用程序代码被单元测试覆盖时,您可以修改代码,而不必担心修改会破坏代码的功能。单元测试使您的代码可以安全地重构。如果您可以重构,那么您就可以使用软件设计模式修改您的代码,从而生成更能抵抗变化的优秀代码。

注意

“重构”是在不改变代码功能的情况下修改代码的过程。

其次,为代码编写单元测试会迫使您以特定的方式编写代码。可测试的代码往往是松耦合的代码。单元测试会单独对代码单元执行测试。为了使您的应用程序可测试,您需要以具有可隔离组件的方式构建应用程序。

当您可以更改第一个类而不更改第二个类时,第一个类与第二个类松耦合。测试驱动开发通常会迫使您编写松耦合代码。松耦合代码能够抵抗变化。

最后,编写单元测试迫使您从用户的角度来看待代码。在编写单元测试时,您会像将来使用您代码的开发人员一样思考。因为编写测试迫使您思考开发人员(也许是未来的您自己)将如何使用您的代码,所以代码往往会设计得更好。

测试驱动开发

在上一节中,我们讨论了为代码构建单元测试的重要性。测试驱动开发是一种软件设计方法,它将单元测试置于编写软件应用程序过程的中心。当您实践测试驱动开发时,您首先编写测试,然后根据测试编写代码。

更精确地说,在实践测试驱动开发时,您在创建代码时会完成三个步骤(红/绿/重构)

  1. 编写一个失败的单元测试(红色)。
  2. 编写通过单元测试的代码(绿色)。
  3. 重构您的代码(重构)。

首先,您编写单元测试。单元测试应该表达您对代码行为的预期。当您首次创建单元测试时,它应该失败。测试应该失败,因为您尚未编写任何满足该测试的应用程序代码。

接下来,您编写足够少的代码,使单元测试通过。目标是以最懒惰、最粗糙、最快的方式编写代码。您不应该浪费时间思考应用程序的架构。相反,您应该专注于编写满足单元测试所表达意图所需的最少量代码。

最后,在编写了足够的代码之后,您可以退一步思考应用程序的整体架构。在此步骤中,您将利用软件设计模式(例如 Repository 模式)重写(重构)您的代码,使您的代码更易于维护。在此步骤中,您可以毫无畏惧地重写代码,因为您的代码受到单元测试的覆盖。

实践测试驱动开发会带来许多好处。首先,测试驱动开发迫使您专注于实际需要编写的代码。因为您不断地专注于只编写足够的代码来通过特定的测试,所以您避免了陷入困境并编写大量您永远不会使用的代码。

其次,“测试优先”的设计方法迫使您从代码将如何被使用的角度编写代码。换句话说,在实践测试驱动开发时,您始终从用户的角度编写测试。因此,测试驱动开发可以带来更简洁、更易懂的 API。

最后,测试驱动开发迫使您将单元测试作为编写应用程序的正常过程的一部分。随着项目截止日期的临近,测试通常是第一个被搁置的事情。另一方面,在实践测试驱动开发时,您更有可能养成编写单元测试的良好习惯,因为测试驱动开发使单元测试成为构建应用程序过程的核心。

短期痛苦,长期收益

构建旨在应对变化的软件需要更多的前期工作。实施软件设计原则和模式需要思考和努力。编写测试需要时间。然而,这个想法是,以正确的方式构建软件所需的初始努力将在未来带来巨大的回报。

有两种类型的开发人员。您可以是牛仔,也可以是工匠。牛仔直接上手,开始编码。牛仔可以快速构建软件应用程序。做牛仔的问题在于软件必须随着时间的推移进行维护。

工匠是耐心的。工匠精心手工构建软件。工匠会小心地为应用程序中的所有代码构建单元测试。工匠创建应用程序需要更长的时间。然而,应用程序创建后,修复应用程序中的错误和添加新功能会更容易。

大多数软件开发人员都以“牛仔”的身份开始他们的编程生涯。然而,在某个时候,您必须放下您的马鞍,开始构建能够经受时间考验的软件。

什么是 ASP.NET MVC?

Microsoft ASP.NET MVC 框架是 Microsoft 用于构建 Web 应用程序的最新框架。ASP.NET MVC 框架从头开始设计,旨在使构建本章讨论的“优秀软件”变得更容易。

ASP.NET MVC 框架是为了支持“基于模式”的软件开发而创建的。换句话说,该框架旨在使在构建 Web 应用程序时更容易实现软件设计原则和模式。

此外,ASP.NET MVC 框架从其核心开始就被设计为支持单元测试。使用 ASP.NET MVC 框架编写的 Web 应用程序具有高度可测试性。

由于 ASP.NET MVC 应用程序具有高度可测试性,这使得 ASP.NET MVC 框架成为实践测试驱动开发时使用的绝佳框架。

ASP.NET MVC 是 ASP.NET 框架的一部分

微软用于构建软件应用程序(包括桌面、Web 和控制台应用程序在内的任何类型的应用程序)的框架被称为 .NET 框架。.NET 框架由庞大的类集组成,数以万计的类,您可以在构建任何类型的软件应用程序时使用它们。例如,.NET 框架包括用于处理文件系统、访问数据库、使用正则表达式和生成图像的类。

ASP.NET 框架是 .NET 框架的一部分。ASP.NET 框架是 Microsoft 用于构建 Web 应用程序的框架。它包含一组专门为支持构建 Web 应用程序而创建的类。例如,ASP.NET 框架包含用于实现网页缓存、身份验证和授权的类。

微软在 ASP.NET 框架之上构建了两个用于开发 Web 应用程序的框架:ASP.NET Web Forms 和 ASP.NET MVC(参见图 1.1)。

01fig01.jpg
图 1.1
ASP.NET 框架

ASP.NET MVC 是 ASP.NET Web Forms 的替代品,但不是替代品。一些开发人员觉得 ASP.NET Web Forms 所代表的编程风格更具吸引力,而另一些开发人员则觉得 ASP.NET MVC 更具吸引力。微软继续对这两种技术进行大量投资。

注意

本书专门讨论 ASP.NET MVC。如果您想了解 ASP.NET Web Forms,请购买我的书《ASP.NET Unleashed》。

MVC 的起源

ASP.NET MVC 框架是新事物;然而,MVC 软件设计模式本身历史悠久。MVC 模式由 Trygve Reenskaug 在著名的施乐帕洛阿尔托研究中心 Smalltalk 小组担任访问科学家期间发明。他于 1978 年撰写了第一篇关于 MVC 的论文。他最初将其称为 Thing Model View Editor 模式,但他很快将该模式的名称更改为 Model View Controller 模式。

注意

MVC 模式的发明者 Trygve Reenskaug 目前在挪威奥斯陆大学担任信息学教授。

MVC 模式最初作为 Smalltalk-80 类库的一部分实现。它最初被用作创建图形用户界面 (GUI) 的架构模式。

当 MVC 模式被改编用于 Web 应用程序时,其含义发生了根本性转变。在 Web 应用程序的上下文中,MVC 模式有时被称为 Model 2 MVC 模式。

MVC 模式已被证明非常成功。如今,MVC 模式被几个流行的 Web 应用程序框架使用,包括 Ruby on Rails、Merb 和 Django。MVC 模式在 Java 世界也很流行。在 Java 世界中,MVC 被用于 Struts、Spring 和 Tapestry 框架。

第一个主要的 ASP.NET MVC 框架是开源的 MonoRail 项目(参见 CastleProject.org)。围绕这个项目仍然存在一个活跃的开发人员社区。

Microsoft ASP.NET MVC 框架最初是由 Scott Guthrie 在 2007 年 10 月飞往得克萨斯州奥斯汀参加第一次 Alt.NET 会议的飞机上创建的。(Scott Guthrie 是 ASP.NET 的创建者之一。)Scott Guthrie 的演讲引起了巨大的轰动,以至于 ASP.NET MVC 框架成为了微软的官方产品。ASP.NET MVC 1.0 于 2009 年上半年发布。

ASP.NET MVC 应用程序的架构

一个 MVC 应用程序,一个模型-视图-控制器应用程序,分为以下三个部分:

  • 模型——MVC 模型包含应用程序中所有不包含在视图或控制器中的逻辑。模型包括应用程序的所有验证逻辑、业务逻辑和数据访问逻辑。MVC 模型包含模型类,这些模型类对应用程序域中的对象进行建模。
  • 视图——MVC 视图包含 HTML 标记和视图逻辑。
  • 控制器——MVC 控制器包含控制流逻辑。MVC 控制器与 MVC 模型和视图交互,以控制应用程序执行的流程。

事实证明,在模型、视图和控制器之间强制实现这种关注点分离是一种构建 Web 应用程序的有用方式。

首先,将视图与 Web 应用程序的其余部分清晰地分离,使您能够重新设计应用程序的外观,而无需触及任何核心逻辑。网页设计师(戴黑色贝雷帽的人)可以独立于构建业务和数据访问逻辑的软件工程师来修改视图。具有不同技能和角色的人员可以修改应用程序的不同部分,而不会互相干扰。

此外,将视图与应用程序的其余逻辑分离,使您将来能够轻松更改视图技术。总有一天,您可能会决定使用 Silverlight 而不是 HTML 在应用程序中重新实现视图。如果您将视图逻辑与应用程序的其他逻辑混淆在一起,那么迁移到新的视图技术将很困难。

将控制器逻辑与应用程序的其余逻辑分离也已被证明是构建 Web 应用程序的有用模式。您经常需要修改用户与应用程序交互的方式。在修改应用程序的执行流程时,您不想触及视图逻辑或模型逻辑。

理解示例 ASP.NET MVC 应用程序

要更牢固地掌握 MVC 应用程序的三个逻辑部分,一个好方法是查看在使用 Visual Studio 创建新的 ASP.NET MVC 项目时自动创建的示例应用程序。

注意

我们将在简介中讨论 ASP.NET MVC 的安装。

请遵循以下步骤

  1. 启动 Visual Studio。
  2. 选择菜单选项“文件”、“新建项目”。
  3. 在“新建项目”对话框中,选择您喜欢的编程语言(C# 或 VB.NET),然后选择“ASP.NET MVC Web 应用程序”模板。将您的项目命名为 MyFirstMvcApp,然后单击“确定”按钮(参见图 1.2)。

    01fig02.jpg

    图 1.2
    创建一个新的 ASP.NET MVC 项目

在您单击“确定”按钮创建新的 ASP.NET MVC 项目后,您会立即看到图 1.3 中的“创建单元测试项目”对话框。保持选中默认选项——是,创建单元测试项目——然后单击“确定”按钮。

01fig03.jpg
图 1.3
创建单元测试项目

当 Visual Studio 为新的 ASP.NET MVC 项目创建默认文件时,您的计算机硬盘将运转几秒钟。所有文件创建完成后,“解决方案资源管理器”窗口应包含图 1.4 中的文件。

01fig04.jpg
图 1.4
新的 ASP.NET MVC 项目中的文件

图 1.4 中的“解决方案资源管理器”窗口包含两个独立的项目:ASP.NET MVC 项目和测试项目。测试项目包含应用程序的所有单元测试。

ASP.NET MVC 文件夹约定

ASP.NET MVC 框架强调约定优于配置。ASP.NET MVC 项目中的每种类型文件都有标准位置。ASP.NET MVC 应用程序项目包含以下文件夹

  • App_Data——包含数据库文件。例如,App_Data 文件夹可能包含 SQL Server Express 数据库的本地实例。
  • Content——包含静态内容,例如图像和层叠样式表文件。
  • Controllers——包含 ASP.NET MVC 控制器类。
  • Models——包含 ASP.NET MVC 模型类。
  • Scripts——包含 JavaScript 文件,包括 ASP.NET AJAX 库和 jQuery。
  • Views——包含 ASP.NET MVC 视图。

在构建 ASP.NET MVC 应用程序时,您应该只将控制器放置在 Controllers 文件夹中,只将 JavaScript 脚本放置在 Scripts 文件夹中,只将 ASP.NET MVC 视图放置在 Views 文件夹中,等等。通过遵循这些约定,您的应用程序将更容易维护,也更容易被其他人理解。

运行示例 ASP.NET MVC 应用程序

当您创建一个新的 ASP.NET MVC 应用程序时,您会得到一个简单的示例应用程序。您可以通过选择菜单选项“调试”,“开始调试”(或按 F5 键)来运行此示例应用程序。

注意

运行 ASP.NET MVC 应用程序时,请确保在“解决方案资源管理器”窗口中选择的是 ASP.NET MVC 项目,而不是测试项目。

首次在 Visual Studio 中运行新的 ASP.NET MVC 应用程序时,您会收到一个对话框,询问您是否要启用调试。只需单击“确定”按钮。

当您运行应用程序时,您的浏览器将打开图 1.5 中的页面。

01fig05.jpg
图 1.5
示例应用程序

您可以使用页面顶部出现的选项卡导航到主页或关于页面。您还可以单击“登录”链接注册或登录应用程序。这就是您能用此应用程序做的所有事情。

此示例应用程序由一个 ASP.NET MVC 控制器和两个 ASP.NET MVC 视图实现。示例应用程序不包含任何业务或数据访问逻辑,因此它不包含任何 ASP.NET MVC 模型类。

控制器位于 Controllers 文件夹中

(C#)

\Controllers\HomeController.cs

(VB)

\Controllers\HomeController.vb

如果您在代码编辑器窗口中打开 HomeController,您会看到清单 1.1 中的文件。

清单 1.1  Controllers\HomeController.cs (C#)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MyFirstMvcApp.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewData[“Message”] = “Welcome to ASP.NET MVC!”;

            return View();
        }

        public ActionResult About()
        {
            return View();
        }
    }
}

清单 1.1  Controllers\HomeController.vb (VB)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index() As ActionResult
        ViewData(“Message”) = “Welcome to ASP.NET MVC!”

        Return View()
    End Function

    Function About() As ActionResult
        Return View()
    End Function
End Class

清单 1.1 中的文件包含一个带有两个方法(名为 Index()About())的类。控制器公开的方法称为动作。Index()About() 动作都返回一个视图。

当您第一次运行示例应用程序时,将调用 Index() 操作,此操作返回 Index 视图。如果您单击“关于”选项卡,将调用 About() 操作,此操作返回 About 视图。

这两个视图可以在 Views 文件夹中的以下位置找到

\Views\Home\About.aspx

\Views\Home\Index.aspx

Index 视图的内容包含在清单 1.2 中。

清单 1.2  Views\Home\Index.aspx (C#)

<%@ Page Language="”C#”" MasterPageFile=”~/Views/Shared/Site.Master”  
    ÂInherits=”System.Web.Mvc.ViewPage” %>

<asp:Content ID=”indexTitle” ContentPlaceHolderID=”TitleContent” runat="”server”">
    Home Page
</asp:Content>

<asp:Content ID=”indexContent” ContentPlaceHolderID=”MainContent” runat="”server”">

    <h2><%= Html.Encode(ViewData[“Message”]) %></h2>
    <p>
        To learn more about ASP.NET MVC visit <a href=”http://asp.net/mvc”
            Âtitle=”ASP.NET MVC Website”>http://asp.net/mvc</a>.
    </p>
</asp:Content>

清单 1.2  Views\Home\Index.aspx (VB)

<%@ Page Language="”VB”" MasterPageFile=”~/Views/Shared/Site.Master”  
Inherits=”System.Web.Mvc.ViewPage” %>

<asp:Content ID=”indexTitle” ContentPlaceHolderID=”TitleContent” runat="”server”">
    Home Page
</asp:Content>

<asp:Content ID=”indexContent” ContentPlaceHolderID=”MainContent” runat="”server”">

    <h2><%= Html.Encode(ViewData(“Message”)) %></h2>
    <p>
        To learn more about ASP.NET MVC visit <a href=”http://asp.net/mvc”  
		title=”ASP.NET MVC Website”>http://asp.net/mvc</a>.
    </p>

</asp:Content>

请注意,视图主要由标准 HTML 内容组成。例如,视图包含标准的 <h2><p> 标签。视图生成发送到浏览器的页面。

摘要

本章旨在为您概述 ASP.NET MVC 框架。本章的第一部分致力于讨论优秀软件的定义。您简要介绍了软件设计原则和模式以及单元测试的重要性。您了解了软件设计原则和模式以及单元测试如何使您能够创建能够应对变化的软件。

接下来,您将了解模型-视图-控制器软件设计模式。您学习了这种模式的历史和优点。您了解了 ASP.NET MVC 框架如何实现模型-视图-控制器模式以及 ASP.NET MVC 如何使您能够执行基于模式的软件开发。

最后,我们探讨了在创建新的 ASP.NET MVC 项目时生成的示例 ASP.NET MVC 应用程序。我们首次了解了 ASP.NET MVC 控制器和 ASP.NET MVC 视图。

© . All rights reserved.