在这个练习中你将学习如何在 Visual Studio 中创建一个 ASP.NET MVC 应用。并初步了解默认项目结构和一些开发约定。
ASP.NET MVC 框架分为 Model, View 和 Controller 三个部分。模型组件(Model)一般用于维护数据库中的持久数据层的状态。视图组件(View)由控制器挑选并渲染到适当的用户界面。默认状态下, ASP.NET MVC 框架用ASP.NET已有的 ASP.NET 页面(.aspx)、 母版页(.master)以及用户控件(.ascx)等类型来作为浏览器呈现。控制器组件(Controller)组件将用户请求定位到适当的控制器(Controller)行为(Action)和方法(Method),从请求中获取用于行为方法运行的参数值, 并处理行为和方法执行中可能产生的错误。 然后控制器用该请求对应的视图进行渲染。 默认状况下,每个组件存放在 MVC WEB 应用工程的一个独立目录下。
任务1 - 创建一个 ASP.NET MVC Web 应用工程
在这个任务中你将通过Visual Studio的MVC模板创建和配置一个空的 ASP.NET MVC 应用工程。
-
打开 Microsoft Visual Studio 2008:依次点击 开始|所有程序|Microsoft Visual Studio 2008|Microsoft Visual Studio 2008.
-
点击 文件 菜单, 指向 新建, 然后点击 项目。
-
在 新建项目 对话框中,确保右上角选中的版本为 .NET Framework 3.5,在 项目类型 下选择 Visual C#,然后在 Visual Studio 已安装的模板 中选择 ASP.NET MVC Web Application 类型。你可以设置项目位置为 **你的路径AspNetMvcEx01-CreatingMvcAppbegin **作为项目目录。
-
修改 名称 为 MvcSampleApp 然后点击 确定 。
*图一:创建新项目对话框 *在点击 确定 按钮之后,Visual Studio 会问你是否同时创建测试项目(would you like to create a test project)。选择 Yes, 输入 MvcSampleApp.Test 作为项目名称(Name of the Project), 然后点击 确定(OK)。注:我安装的是Visual Studio 2008 SP1 简体中文版 + ASP.NET MVC 1.0,在我的系统上,创建测试项目的对话框为英文,因此这里加上英文对照。 提示:当你创建一个新的MVC Web应用时, Visual Studio 会为你提供同时创建两个项目的选择,第一个项目是Web项目用来实现你的应用,第二个项目是一个测试项目,你可以在其中为你的MVC组件编写单元测试。
*图二:创建 MVC 单元测试项目 *提示:测试项目对话框中的 测试框架(Test Framework) 下拉列表现在只有一个 Visual Studio Unit Test,这个列表是可扩展的,在你的机器上安装了其他测试框架的时候,它将会包含其他的测试框架供你选择。由此你可以容易地用你喜欢的单元测试框架来为你的 ASP.NET MVC 应用编写单元测试。 -
在Visual Studio 中配置站点使用端口 50000。这一步是为了和本动手实验中的后续联系保持一致所必须的。
在 **解决方案浏览器** 中,右击 **MvcSampleApp** 项目,并在上下文菜单中选择 **属性** 。在 **属性** 页中,打开 **Web** 标签。In the **Servers** section select **Specific Port**. 在 **服务器** 设置项下面,选择 **使用Visual Studio开发服务器**,并选中 **特定端口** 。设置端口号为 **50000** 。按下 **Ctr + S** 保存所做的改动。
[<img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" src="//file.ofcdn.com/attachments/2009/04/image-thumb3.png" border="0" alt="image" width="635" height="480" />][3] *图三:配置本地测试属性*
任务2 - 浏览解决方案结构
ASP.NET MVC 框架包含 Visual Studio 项目模板,可以帮助你创建支持 MVC 模式的 Web 应用程序结构。通过该模板会创建的 MVC Web 项目中包含所有必须的文件夹、项目模板,以及必须的配置信息。
In this task you will examine the solution structure to understand the involved elements and its relationships.在本任务中,你将检查所创建的解决方案结构,以帮助你理解构成 ASP.NET MVC 的每个部分以及它们之间的关系。
**
在你创建 ASP.NET MVC Web 应用项目时, MVC 组件将基于下面的项目文件夹进行拆分:
- App_data: App_tata 文件夹是数据的物理存储。这个文件夹与使用Web Forms方式开发的 ASP.NET Web 站点下相同目录具有相同的作用。
- Content: Content 文件夹是用于添加内容文件(例如样式表,图片等)的推荐存放位置。一般来说,Content 目录用于存放静态文件。
- **Controllers: **控制器类。在基于 MVC 的应用程序中负责处理用户交互、操作模型以及决定渲染哪一个视图到用户界面。 提示:MVC 框架要求所有的控制器名称以“Controller”作为后缀。例如 HomeController、 LoginController 或者 ProductController。
- **Models:**Models 目录为你的 MVC Web 应用提供代表应用模型的类定义。通常该目录下包含对象和数据访问逻辑的类定义代码。典型情形下,实际的对象模型将存放于单独的类库中。但是在你创建一个新应用时,你可能会把类放在这个目录下然后在后续开发步骤中再把它们移动到单独的类库中。
- **Scripts:**这是存放你的应用中需要的 JavaScript 文件的推荐目录。
- Views:Views 目录是存放视图的推荐目录。视图是负责呈现用户界面的组件。视图目录下一般包含 .aspx、.ascx 和 .master 文件,以及渲染视图所需的其它类型文件。在 Views 目录下,每个控制器有一个自己的目录;该目录用控制器名称的前缀命名。比如,你有一个名为 HomeController 的控制器, 那么在 Views 目录下应该包含一个名为 Home 的目录。默认情形下, 在 ASP.NET MVC 框架加载视图时, 它将在对应的 ViewsControllerName 文件夹下寻找对应的 .aspx 文件 ( Views[ControlerName][Action].aspx)
- **ViewsShared:**默认情形下,在 Views 目录下还有一个名为 Shared 的目录, 这个目录不与任何一个具体的控制器关联。 Shared 目录用于存放在多个控制器中共享的视图。 例如,你可以将 Web 应用的母版页存放在 Shared 目录下。 提示:除了上面列出的目录外, MVC Web 应用还使用 Global.aspx 文件来设置 URL 路径映射, 使用 Web.config 文件来配置应用程序。
任务3 - 理解控制器
在不使用 MVC 框架的 ASP.NET 应用中,用户交互围绕页面进行组织, 并通过这些页面中的事件来进行交互处理。与此不同的是,在 ASP.NET MVC 应用中, 用户交互由控制器以及他们所包含的行为方法来进行组织和处理。
ASP.NET MVC 框架将 URLs 映射到指向相关控制器的类。 控制器处理请求, 处理用户输入和交互操作, 并执行对应的应用逻辑。 一个控制器类通常调用一个单独的视图组件来为请求生成 HTML 标记。 在 MVC 应用中,视图只负责信息呈现;控制器处理和响应用户输入和交互。
- 打开 Home Controller:在解决方案浏览器中,双击 Controllers 目录下的 HomeController.cs 文件。 提示: MVC 框架的默认行为要求所有控制器类以“Controller”作为后缀。如果有必要的话,可以改变这个约定。 所有的控制器类必须实现 IController 接口(或者从 Controller 基类继承, Controller 基类已经实现 IController 接口)。 控制器中对行为和方法进行定义。在 MVC Web 应用的典型工作流程下, 控制器行为和方法处理传入的 Web 请求。 这些行为和方法使用传入参数值来执行应用代码,获取和更新数据库中的数据模型对象, 然后选择一个视图进行渲染,对浏览器进行输出。
[HandleError] public class HomeController : Controller { public ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); } public ActionResult About() { return View(); } }
*示例代码:控制器、行为和方法。*提示: **[HandleError]** 过滤器属性在 ASP.NET MVC 请求发生错误时,为控制器、行为和方法提供友好的错误显示。 提示:注意方法的名称是与请求URL中的行为绑定的。要使一个行为方法可以调用,该行为方法的保护级别必须是 public, 并且没有附加 **[NonActionAttribute]** 属性。 行为方法必须返回 **ActionResult** 实例。 Action Result 是控制器行为执行后的返回结果, 用于响应浏览器请求。Action Result 可以包括: 渲染视图、重定向到其它行为、重定向到其它页面等。 ASP.NET MVC 框架支持多种 Action Results 类型,包括: - **ViewResult**:呈现 HTML 和 标记。 - **EmptyResult:** 不呈现结果。. - **RedirectResult**: 重定向到一个新的URL。 - **JsonResult**: 输出一个可以用于 AJAX 应用的 JavaScript 对象。 - **JavaScriptResult**: 输出 JavaScript 脚本。 - **ContentResult**: 输出文本。 - **FileContentResult**: 输出可下载的文件(二进制内容)。 - **FilePathResult**: 输出可下载的文件(文件路径)。 - **FileStreamResult**: 输出可下载的文件(文档流)。 在上面的实例代码中,控制器行为没有返回 ViewResult(), 而是使用了 Controller 基类中的 View() 方法。正常情况下,你不必直接返回 ActionResul, 而是调用下面所列的 Controller 基类方法之一: - **View**: 返回 **ViewResult** 作为行为结果。 - **Redirect**: 返回 **RedirectResult** 作为行为结果。 - **RedirectToAction**: 返回 **RedirectToRoutResult** 作为行为结果(重定向到指定的行为)。 - **RedirectToRoute**: 返回 **RedirectToRoutResult** 作为行为结果(重定向到指定的路径)。 - **Json**: 返回 **JsonResut** 作为行为结果。 - **JavaScriptResult**: 返回 **JavaScriptResult**。 - **Content**: 返回 **ContentResult** 作为行为结果。 - **File**: 根据传入到方法的参数返回 **FileContentResult**、 **FilePathResult** 或者 **FileStreamResult**。 了解更多信息,请参见:<http://www.asp.net/learn/mvc/tutorial-03-cs.aspx>。
- 视图可以根据控制器类提供的特定的数据只渲染自身的输出。在 ASP.NET MVC 框架中我们把这些特定的数据成为 ViewData。提示:要向视图传递数据,你可以使用 ControllerBase 类的 ViewData 属性。该属性返回一个 ViewDataDictionary 对象,对象中包含大小写敏感的字符串型的键值。在本实验中你可以使用 ViewData 字典或者强类型数据。注意在 Home 控制器中的方法在 ViewData 中设置值并调用关联的控制器的 View 方法来返回视图。
public ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); }
任务4 - 理解视图
在 MVC Web 应用的常规工作流程中, 控制器行为方法处理传入的 Web 请求。这些行为方法使用传入参数值来执行应用代码, 然后取得或者更新数据库中的数据模型对象。然后她们再选择一个视图进行渲染以响应浏览器。
- 在 MVC 应用中视图是负责呈现用户界面的组件。视图被特别设计为呈现逻辑的封装。它们不应包含任何应用逻辑或者数据库查询代码。视图在控制器调用时渲染视图的方法时,使用控制器提供的视图数据类来渲染恰当的用户界面。
- 视图使用 .aspx、.ascx 以及 .master 以及其它文件。其它文件一般是与渲染视图相关的文件。 Views 文件夹为每个控制器包含以控制器的前缀来命名的目录。
- 打开 Home 控制器的 Index 视图:在 解决方案浏览器 中, 双击 ViewsHome 目录下的 Index.aspx 文件。 提示:视图模板默认不包含后台代码文件。这样主要是为了强化 MVC 应用中 视图被设计为纯粹用于渲染而不包含任何与呈现无关的代码这一概念。
<%@ 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>
[][5] 提示:Html 对象是 HtmlHelper 类的实例,用于为生成 HTML 标记提供常见的实用的方法。Encode 方法将 HTML 编码为具体的字符串。 通过这种方式, 视图对通过 **ViewData** 字典从控制器中获得的 **Message** 值进行编码输出。 在你的视图中,你可以以后绑定的方式或者强类型的方式访问 ViewData 数据。如果你的视图继承 **ViewPage**, **ViewData** 属性就是后绑定的字典类型。 如果你的视图集成自 **ViewPage<T>** 泛型, 其中 **T** 代表控制器传递给视图的 **ViewData** 的对象数据类型, **ViewData** 属性在这里就是与你的控制器传递的数据类型相同的强类型。
任务5 - 理解 ASP.NET URL 路径
ASP.NET MVC 框架使用 ASP.NET 路径(ASP.NET Routing)进行 URLs 到控制器类和行为的映射。 ASP.NET 路径根据你定义的模式解析 URLs 中的变量,并自动将变量传递给控制器行为作为参数。通过这样的方式,URLs 不必映射到网站中特定的文件。
默认情形下, ASP.NET MVC 项目有一个预配置的 URL 路径映射规则, 使你可以轻松地开始你的应用开发而不用做任何明确的配置。你可以使用 ASP.NET MVC 项目模板自动为 ASP.NET 应用 创建的 Global.asax 文件中默认的基于名称的(name-based)的 URL 映射约定开始开发。
The preconfigured routing rule indicates that the ASP.NET MVC framework should by default map URLs to Controllers using a [controller]/[action]/[id] pattern when determining which Controller class to instantiate, and which Action method to invoke (along with which parameters should be passed in). 预配置的路径规则指示 ASP.NET MVC 框架在检测哪一个 控制器 类需要实例化以及哪一个 行为 方法应该被调用时(以及哪一些参数应该被传入)的时候,默认将 URLs 按照 [controller]/[action]/[id] 模式进行映射,
提示:在 解决方案浏览器 中双击 Global.asax,可以查看预配置的路径定义。
- 创建一个 MvcSampleApp 项目的新实例:在 解决方案浏览器 中右键点击 MvcSampleApp 项目,指向 调试 并选择 创建新实例。 提示:如果出现 未启用调试 对话框, 选择 修改Web.config文件以启用调试 并点击 确定。A request will be made to http://localhost:50000 which will be intercepted by the ASP.NET Routing engine applying the Default registered route (the pattern is [controller]/[action]/[id]). Since the URL does not contain any controller to map, the routing engine will instantiate a default controller (Home), and invoke a default action (Index) specified in the registered route.一个指向 http://localhost:50000 的请求将被创建,该请求将被 ASP.NET 路径 引擎拦截并应用在路径规则 ([controller]/[action]/[id] 模式)中注册的 Default 规则。一旦 URL 不包含任何指定的 Controller 映射, 路径引擎将实例化默认控制器(Home), 并调用默认的行为(Index)。
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); }
[][5] 在此情形下,默认的路径参数为: 控制器 = Home, 行为 = Index; 因此 Home 控制器的 Index View 将被渲染呈现到浏览器中。 [<img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" src="//file.ofcdn.com/attachments/2009/04/image-thumb5.png" border="0" alt="image" width="581" height="411" />][7] *图五:MVC 示例应用的主页* 提示:默认 URL 路径模式就如之前指出的: **…/[ControllerName]/[Action]/[Parameters]**。你可以在 **Global.asax.cs** 文件中的 **RegisterRoutes** 方法下定义新的路径规则。 路径规则将通过 **Global.asax** 或者 **Global.asax.vb** 文件中的 **Application_Start** 方法初始化。
- 点击页面右上角的 About 链接,浏览 About 页面。在浏览器中你可以看到地址重定向到 http://localhost:50000/Home/About,该地址调用了 Home 控制器 的 About 方法。
图六:About 页面
练习一到此就结束了。下次我们将进行 **练习二:开发 ASP.NET MVC 应用 **。
(文本翻译自 ASP.NET MVC Training Kit,下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyID=1E0BE0B2-910A-4676-9F3A-41E4D9C0FC08&displaylang=en)
来自:裁纸刀下 - 小李刀刀博客
原文链接:[译]ASP.NET MVC动手实验1-2:创建ASP.NET MVC应用
裁纸刀下版权所有,允许非商业用途转载,转载时请原样转载并标明来源、作者,保留原文链接。