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

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

 

t_ch1_1.png

对于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工程

t_ch1_2.png

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

3 – 创建单元测试工程

t_ch1_3.png

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

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

t_ch1_4.png

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的控制器和视图。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值