[译]Chapter 1 - An Introduction to ASP.NET MVC(3)

原文地址:Chapter 1 - An Introduction to ASP.NET MVC

 

What is ASP.NET MVC?

ASP.NET MVC 框架是微软最新推出的用来构建web应用程序的框架,本章前面已经讨论了什么是好的软件,ASP.NET MVC 框架就是用来更容易的构建这种软件。

ASP.NET MVC 框架被创建成支持基于模式的软件开发,换言之,这个框架设计的初衷,是为了在你构建web应用程序时,更容易实现软件设计的原则和模式。

更进一步,ASP.NET MVC 框架设计的核心是支持单元测试,使用ASP.NET MVC 框架编写的web应用程序都是高度可测试的。

因为ASP.NET MVC 程序是高度可测试的,这样在实践测试驱动开发时, ASP.NET MVC 框架就是一个很棒的框架。

ASP.NET MVC is Part of the ASP.NET Framework

微软用于构建软件应用程序的框架——任何类型的应用,包括桌面、web和控制台应用——被称为.NET框架。.NET框架是由一个巨大的类的集合组成,包括成千上万的类,在你构建人和类型的应用程序时,你都可以使用这些类。例如,.NET框架中包含了和文件系统进行交互、访问数据库、使用正则表示以及生成图片等。

ASP.NET 框架是.NET框架的一部分,它是微软用来构建web应用程序的框架,它包含了一些类的集合,这些类用来支持构建web应用程序。例如,ASP.NET框架包含了用于实现web页面缓存、认证以及授权的类。

ASP.NET框架之上,微软有两个用于构建web应用程序的框架:ASP.NET Web Forms ASP.NET MVC(参见图1)。

1 – The ASP.NET frameworks


对于ASP.NET Web Forms 来说,ASP.NET MVC 是另外一种选择,而不是替代。一些开发人员发现由ASP.NET Web Forms 代表的编程风格更容易接受,而另外一些开发人员发现由ASP.NET MVC 代表的编程风格更容易接受。微软会对这两技术上都进行巨大的投资。

*** Begin Note ***

这本书的主题是ASP.NET MVC ,如果你想学习ASP.NET Web Forms ,那么请购买我的书《ASP.NET Unleashed》。

*** End Note ***

The Origins of MVC

ASP.NET MVC框架是新的,但是MVC设计模式本身已经有一个比较长的历史了。MVC模式由Trygve Reenskaug 发明,当时他在著名的施乐帕洛阿尔托研究中心的Smalltalk组担当访问学者。Trygve Reenskaug1978年发表了关于MVC的第一篇论文,最初,他称这种模式为模型视图编辑器模式(Model View Editor),但是很快他将其改为模型视图控制器模式。

*** Begin Note ***

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

*** End Note **

MVC模式第一次是以Smalltalk-80类库的一部分而实现的。它最初被当做一种用来创建图形用户界面(GUI)的架构层次的模式。

当将MVC应用到web中时,MVC的含义也从根本上发生了改变。在web应用程序的环境中,MVC模式有时是指Model2 MVC模式。

MVC模式已经被证明是非常成功的,今天,MVC模式被应用于一些非常流行的web应用程序框架中,包括RoRMerbDjangoMVC模式在Java的世界汇总也很受欢迎,在Java的世界中,MVC被应用于StrutsSpringTapestry框架中。

The Architecture of an ASP.NET MVC Application

一个MVC应用程序可以分为以下3部分:

· 模型 – MVC的模型包含了应用程序中所有的不再视图和控制器中的逻辑,包括应用程序的验证逻辑、业务逻辑和数据访问逻辑。MVC的模型还包含了那些用于对应用程序的领域进行建模时使用的模型类。

· 视图 – MVC中的视图包含HTML标签和视图逻辑。

· 控制器 – MVC中的控制器包含控制流逻辑。MVC中的控制器通过和MVC模型以及视图进行交互的方式来控制应用程序执行的流程。

在构建web应用程序时,对模型、视图和控制器进行强行分离关注点已经被证明是一个很有用的方法。

首先,将视图和应用程序的其他部分很清晰的分离可以使你在对程序的外观进行重新设计时,不会触及任何核心逻辑。Web网页设计人员(一个戴着黑色贝雷帽的人)可以改动视图,而无需担心软件的业务逻辑和数据访问逻辑。具有不同技能和角色的人可以针对程序的不同部分进行改动,而不用担心是否会互相影响。

更进一步,将视图和应用程序的其他部分很清晰的分离可以使你将来很容易的更改视图技术。有一天你可能会决定使用Sliverlight来对视图进行重新实现,而不使用HTML。如果你将视图逻辑和其他部分缠绕在一起,那么转换视图技术将是很困难的。

将控制器逻辑和应用程序的其他逻辑进行分离也已经被证明是用来构建web应用程序的一个很有用的模式。你会经常需要更改用户和程序交互的方式,当对程序的执行流行进行改动时,你不会想触及视图逻辑或者模型逻辑。

Understanding the Sample ASP.NET MVC Application

有一个好的方法可以对MVC应用程序的3部分有一个更明确的理解,那就是去查看当你使用Visual Studio创建一个ASP.NET MVC 工程时自动生成的示例应用程序。

按照以下3个步骤:

1) 启动Visual Studio

2) 选择文件->新工程

3) 在新工程对话框中,选择你最喜欢的编程语言(C#或者VB.NET),然后选择ASP.NET MVC Web应用程序模板,为你的项目起名MyFirstMvcApp ,最后点击OK按钮(请参见图2)。

2 – 新建一个ASP.NET MVC工程

在你点击OK按钮来创建一个ASP.NET MVC 项目后,你会看到如图3所示的用来来创建一个单元测试工程的对话框,选择默认的设置没错,是创建单元测试工程然后点击OK按钮。

3 – 创建单元测试工程

你的电脑硬盘接下来会连续闪几秒,这是Visual Studio在为新的ASP.NET MVC 项目创建默认的文件。当所有的文件被创佳完成后,解决方案窗口应该包含如图4所示的文件。

4 – 新的ASP.NET MVC项目的文件

4中的解决方案窗口中包含了两个独立的工程:ASP.NET MVC 工程和测试工程,测试工程中包含了为你的应用程序准备的所有单元测试。

ASP.NET MVC Folder Conventions

ASP.NET MVC 框架强调配置的约定,在一个ASP.NET MVC 工程中,每种类型的文件都有一个标准的位置,ASP.NET MVC 应用程序工程包含以下文件夹:

· App_Data – 包含数据库文件,例如App_Data文件夹可能包含SQL Server Express数据库的一个本地实例。

· Content – 包含静态内容,例如图片和CSS文件。

· Controllers – 包含ASP.NET MVC 控制器类。

· Models – 包含ASP.NET MVC 模型类。

· Scripts – 包含JavaScript文件,其中包括ASP.NET AJAX库和jQuery

· Views – 包含ASP.NET MVC视图类。

当构建ASP.NET MVC 应用程序时,你应该将控制器只放到Controller文件夹中,将JavaScript脚本只放到Scripts 文件夹中,将视图放入到View文件夹中,如此这般通过遵循这些约定,你可以使程序更加容易维护,更容易被别人理解。

Running the Sample ASP.NET MVC Application

当创建一个新的ASP.NET MVC 应用程序时,你会看到一个非常简单的示例程序,你可以通过选择菜单中的Debug->Start Debugging(或者按下F5)来运行它。

*** Begin Note ***

当运行ASP.NET MVC 应用程序时,你要确保在解决方案窗口中选择的是ASP.NET MVC 工程,而不是测试工程。

*** End Note ***

当第一次在Visual Studio中运行一个新的ASP.NET MVC 应用程序时,你会看到一个提示是否允许调试的对话框,点击OK按钮即可。

当程序运行时,你的浏览器会打开,如图5所示。

5 – 示例应用程序

你可以利用页面上部的tab键在HomeAbout页之间进行切换,你也可以点击Login的链接去注册或者登陆到应用程中。这就是你能够对这个应用程序做的所有操作。

示例程序中包括了一个控制器和两个视图,它并没有包含任何业务逻辑和着数据访问逻辑,所以它并不包含任何模型类。

控制器放置在Controller文件夹中。

[C#]

\Controllers\HomeController.cs

[VB]

\Controllers\HomeController.vb

如果你在代码编辑器中打开HomeController文件,会看到如列表1所示的代码:

列表 1 – Controllers\HomeController.cs

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();  
        }  
    }  
}  

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 – Controllers\HomeController.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中的文件包含一个类和两个方法,方法名是Index()和About()。暴露给控制器的方法被称为ActionIndex()和About()都返回一个视图。<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

 

当你第一次运行示例程序时,Index()被调用,它会返回一个名为Index的视图;如果你点击About进行切换,About()被调用,它会返回一个名为About的视图。

这两个视图可以在以下位置找到:

\Views\Home\About.aspx

\Views\Home\Index.aspx

Index视图的内容如列表2所示:

列表 2 – Views\Home\Index.aspx (C#)

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>  
  
<asp:Content ID="indexHead" ContentPlaceHolderID="head" runat="server">  
    
<title>Home Page</title>  
</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 
<href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.  
    
</p>  
</asp:Content>  

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
 
<asp:Content ID="indexHead" ContentPlaceHolderID="head" runat="server">
    <title>Home Page</title>
</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>

列表 2 – Views\Home\Index.aspx (VB)

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>  
  
<asp:Content ID="indexHead" ContentPlaceHolderID="head" runat="server">  
    
<title>Home Page</title>  
</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 
<href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.  
    
</p>  
</asp:Content>  

请注意视图中的内容大部分是标准的HTML代码,例如,视图中包含标准的<h2><p>标签,视图会生成一个网页,发送给浏览器。<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
 
<asp:Content ID="indexHead" ContentPlaceHolderID="head" runat="server">
    <title>Home Page</title>
</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>

 

Summary

本章的目标是为你提供关于ASP.NET MVC 框架的鸟瞰。第一部分专注于讨论好的软件的定义,随后向你简要的介绍了软件设计的原则、模式和单元测试的重要性,以及这些是如何帮助你构建易于应对变更的软件。

接下来,我向你介绍了MVC设计模式,包括MVC设计模式的历史以及它能带来的好处。你可以了解到ASP.NET MVC框架是如何实现MVC模式以及它是如何使你可以基于模式进行软件开发。

最后,我们探索了一个ASP.NET MVC的示例程序,这个程序是你在新建一个ASP.NET MVC工程时自动生成的,我们第一次浏览了ASP.NET MVC的控制器和视图。

 

 

posted @ 2009-02-08 12:53  李潘  阅读(474)  评论(0编辑  收藏  举报