了解模型、视图和控制器

本教程对 ASP.NET MVC 的模型、视图和控制器提供了高层面的概述。换句话说,它解释了 ASP.NET MVC 中的 ‘M’、‘V’和‘C’。

阅读本教程后,您将会了解 ASP.NET MVC 应用程序的不同部分如何协同工作。您还将了解 ASP.NET MVC 应用程序的层次结构与 ASP.NET Web Forms 应用程序或 Active Server Pages 应用程序层次结构的不同之处。

示例 ASP.NET MVC 应用程序

用于创建 ASP.NET MVC Web 应用程序的默认 Visual Studio 模板包括一个非常简单的示例应用程序,可以使用该应用程序了解 ASP.NET MVC 应用程序的各个不同部分。在本教程中,我们将利用这个简单的应用程序。

通过启动 Visual Studio 2008 并选择菜单项 File,New Project,使用 ASP.NET MVC 模板可以创建新的 ASP.NET MVC 应用程序(如图 1 所示)。在 New Project 对话框中,在 Project Types 下选择自己偏爱的编程语言(Visual Basic 或 C#),然后在 Templates 下选择 ASP.NET MVC Web Application。单击 OK 按钮。

图 1:New Project 对话框(单击查看大图)

在创建新的 ASP.NET MVC 应用程序时,将出现 Create Unit Test Project 对话框(如图 2 所示)。通过这个对话框可以在自己的解决方案中创建单独的项目,以测试 ASP.NET MVC 应用程序。选择选项 No, do not create a unit test project,然后单击OK按钮。

图 2:创建 Unit Test 对话框(单击查看大图)

创建新的 ASP.NET MVC 应用程序后,您将可以在 Solution Explorer 窗口中看到若干个文件夹和文件。具体地说,您将可以看到三个文件夹,名称分别为 Models、Views 和 Controllers。可以从文件夹名称中猜出,这些文件夹包含用于实现模型、视图和控制器的文件。

如果展开 Controllers 文件夹,则应该看到名称为 HomeController.cs 的文件。如果展开 Views 文件夹,则应该看到两个名称为 Home 和 Shared 的子文件夹。如果展开 Home 文件夹,则将看到两个其他的文件,名称为About.aspxHome.aspx(如图 3 所示)。这些文件组成了默认 ASP.NET MVC 模板中包含的示例应用程序。

通过选择菜单选项 Debug, Start Debugging,可以运行示例应用程序。也可以按 F5 键运行。

在第一次运行 ASP.NET 应用程序时,将出现图 4 中的对话框,建议启用调试模式。单击 OK 按钮运行应用程序。

图 4:Debugging Not Enabled 对话框(单击查看大图)

在运行 ASP.NET MVC 应用程序时,Visual Studio 将在 Web 浏览器中启动应用程序。示例应用程序由两个页面组成:Index 页面和 About 页面。当应用程序第一次启动时,将出现 Index 页面(如图 5 所示)。通过单击应用程序右上方的菜单链接可以导航至 About 页面。

图 5:Index 页面(单击查看大图)

请注意浏览器地址栏中的 URL。在单击 Home 菜单链接时,浏览器地址栏中的 URL 更改为 /Home。在单击 About 菜单链接时,浏览器地址栏中的 URL 更改为 /About

如果关闭浏览器窗口并返回 Visual Studio,则找不到名称为 Home 或 About 的文件。这些文件不存在。这是怎么回事呢?

URL 和页面并不是对等的

在构建传统的 ASP.NET Web Forms 应用程序或 Active Server Pages 应用程序时,URL 和页面是一一对应的。如果从服务器上请求名称为 SomePage.aspx 的页面,则硬盘上最好有名称为 SomePage.aspx 的页面。如果 SomePage.aspx 文件不存在,则将出现 404 – Page Not Found 错误。

相反,在构建 ASP.NET MVC 应用程序时,在浏览器地址栏中键入的 URL 和应用程序中的文件不存在对应关系。在 ASP.NET MVC 应用程序中,URL 对应的是控制器操作,而不是硬盘上的页面。

在传统的 ASP.NET 或 ASP 应用程序中,浏览器请求是映射到页面上的。在 ASP.NET MVC 应用程序中,浏览器请求是映射到控制器操作的。ASP.NET Web Forms 应用程序关注的是内容。相反,ASP.NET MVC 应用程序关注的是应用程序逻辑。

了解 URL 路由

浏览器请求通过一项名为 URL 路由的 ASP.NET MVC 功能映射到控制器操作。URL 路由将进入的请求发送给控制器操作。

URL 路由使用路由表处理进入的请求。此路由表在应用程序第一次启动时创建。路由表在 Global.asax 文件中设置。默认的 MVC Global.asax 文件包含在程序清单 1 中。

程序清单 1 Global.asax

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Routing; namespace MvcApplication1{     public class GlobalApplication : System.Web.HttpApplication     {          public static void RegisterRoutes(RouteCollection routes)          {               routes.IgnoreRoute("{resource}.axd/{*pathInfo}");               routes.MapRoute(               "Default",               "{controller}/{action}/{id}",               new { controller = "Home", action = "Index", id = ""}               );          }           protected void Application_Start()           {                RegisterRoutes(RouteTable.Routes);           }      } }

当 ASP.NET 应用程序第一次启动时,调用 Application_Start() 方法。在程序清单 1 中,该方法调用 RegisterRoutes()RegisterRoutes() 方法创建默认的路由表。

默认的路由表中包含一个路由。该默认路由将所有进入的请求拆分为三个单元(URL 单元是正斜杠之间的所有内容)。第一个单元映射到控制器名称,第二个单元映射到操作名称,最后一个单元映射到传递给操作名称 ID 的参数。

例如,考虑下面的 URL:

/Product/Details/3

此 URL 被解析为如下三个部分:

Controller = ProductController

Action = Details

Id = 3

请注意,前缀控制器被附加到控制器参数的末端。这只是 MVC 的一个特殊之处。

默认路由包括所有三个单元的默认值。默认控制器是 HomeController,默认操作是 Index,而默认 ID 是一个空字符串。请观察这些默认值,考虑如何解析下面的 URL:

/Employee

此 URL 被解析为如下三个参数:

Controller = EmployeeController

Action = Index

Id = “”

最后,如果打开 ASP.NET MVC 应用程序而不提供任何 URL(例如 http://localhost/),那么 URL 将被解析为:

Controller = HomeController

Action = Index

Id = “”

请求将被发送到 HomeController 类上的 Index() 操作。

了解控制器

控制器负责控制用户与 MVC 应用程序的交互方式。控制器决定在用户发出浏览器请求时向用户发送什么样的响应。

控制器只是一个类(例如,Visual Basic 或 C# 类)。示例 ASP.NET MVC 应用程序包括一个名称为 HomeController.cs 的控制器,该控制器位于 Controllers 文件夹内。HomeController.cs 的内容如程序清单 2 所示。

程序清单 2 HomeController.cs

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;    namespace MvcApplication1.Controllers{     public class HomeController : Controller     {          public ActionResult Index()          {               ViewData["Title"] = "Home Page";               ViewData["Message"] = "Welcome to ASP.NET MVC!";               return View();          }           public ActionResult About()          {               ViewData["Title"] = "About Page";               return View();          }     }}

请注意,HomeController 有两个方法,名称为 Index()About()。这两个方法对应于控制器公开的两个操作。URL /Home/Index 调用 HomeController.Index() 方法,而 URL /Home/About 调用 HomeController.About() 方法。

控制器中的任何公共方法都作为控制器操作被公开。请小心对待它们。这意味着通过向浏览器输入正确的 URL 来访问 Internet 的任何人都可以激活包含在控制器中的任何公共方法。

了解视图

HomeController 类公开的两个控制器方法 Index()About() 都返回了一个视图。视图包括发送到浏览器的 HTML 标记和内容。在使用 ASP.NET MVC 应用程序时,视图就等于页面。

必须在正确的位置创建视图。HomeController.Index() 操作返回位于以下路径的视图:

\Views\Home\Index.aspx

HomeController.About() 操作返回位于以下路径的视图:

\Views\Home\About.aspx

总之,如果要为控制器操作返回视图,则需要在 Views 文件夹中使用与控制器相同的名称创建子文件夹。在子文件夹中,必须创建与控制器操作名称相同的 .aspx 文件。

程序清单 3 中的文件包含 About.aspx 视图。

程序清单 3 About.aspx

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="MvcApplication1.Views.Home.About"%> <asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">     <h2>About Us</h2>     <p>          TODO: Put <em>about</em> content here.     </p></asp:Content>

如果忽略程序清单 3 中的第一行,则其余大多数视图的内容都由标准的 HTML 组成。在此处,可以通过输入任何您想要的 HTML 修改视图的内容。

视图非常类似于 Active Server Pages 或 ASP.NET Web Forms 的页面。视图包括 HTML 内容和脚本。可以使用您偏爱的 .NET 编程语言(如 C# 或 Visual Basic .NET)编写脚本。使用脚本显示动态内容,如数据库中的数据。

了解模型

我们已经讨论了控制器和视图。要讨论的最后一个主题是模型。什么是 MVC 模型?

MVC 模型包含所有视图或控制器不包含的应用程序逻辑。模型应该包含所有应用程序业务逻辑和数据库访问逻辑。例如,如果您正在使用 LINQ to SQL 访问数据库,那么您将在 Models 文件夹中创建 LINQ to SQL 类(dbml 文件)。

视图应该只包含与生成用户界面相关的逻辑。控制器应该只包含要求返回正确视图或将用户重定向到另一操作所需的最小逻辑。其他所有内容都应包含在模型中。

总之,应该努力实现高效模型和简化控制器。控制器方法应该只包含几行代码。如果控制器操作过长,则应该考虑将逻辑移动到 Models 文件夹中的一个新类中。

总结

本教程就 ASP.NET MVC Web 应用程序的各个不同部分提供了高水平的概述。您学习了 URL 路由如何将进入的浏览器请求映射到特定控制器操作。您还学习了控制器如何协调视图返回到浏览器的方式。最后,学习了模型如何包含应用程序业务和数据库访问逻辑。

http://msdn.microsoft.com/zh-cn/dd408936

了解模型、视图和控制器相关推荐

  1. ASP.NET MVC教程:理解模型、视图和控制器(1)

    本文对ASP.NET MVC的模型.视图和控制器做一次高级概述,换句话说,就是解释ASP.NET MVC中的"M""V""C".阅读完本文后 ...

  2. mvc 视图和模型的对应_通过在酒吧订购饮料来解释模型视图控制器(MVC)

    mvc 视图和模型的对应 by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) 通过在酒吧订购饮料来解释模型视图控制器(MVC) (Model-View-Contro ...

  3. [翻译:ASP.NET MVC 教程]理解模型、视图和控制器

    本篇教程为你提供了ASP.NET MVC的模型.视图和控制器的高级概述.换句话说,即本文向你解释了在ASP.NET MVC中"M"."V"和"C&qu ...

  4. 模型视图控制器mvc

    模型视图控制器mvc MVC就是模型 视图 控制器的缩写 视图和用户交互 通过事件导致控制器改变 控制器改变导致 模型改变 或者控制器同时改变两者 模型改变导致视图改变 或者视图改变 潜在的从模型里面 ...

  5. java控制器_Java用户界面 模型-视图-控制器(MVC)模式

    Swing组件的MVC设计模式 在解决一个问题时,不需要从头做起,而是参考过去的经验,设计模式是一种方法,以一种结构化的形式展示了前人的经验. 前面提到过的Java中的AWT事件处理机制采用了&quo ...

  6. 雷林鹏分享:YII 模型-视图-控制器(MVC)设计模式

    Yii 使用了 Web 开发中广泛采用的模型-视图-控制器(MVC)设计模式. MVC的目标是将业务逻辑从用户界面的考虑中分离,这样开发者就可以更容易地改变每一部分而不会影响其他. 在 MVC中,模型 ...

  7. MVC(Model View Controller)模型-视图-控制器

    MVC与模板概念的理解       MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现 ...

  8. python设计模式【8】-模型·视图·控制器-复合模式

    UML类图简介 设计模式的分类 面向对象的设计原则 python设计模式[1]-单例模式 python设计模式[2]-工厂模式 python设计模式[3]-门面模式 python设计模式[4]-代理模 ...

  9. MVC 模型-视图-控制器

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Mode ...

最新文章

  1. POWERPCB常用技巧
  2. vector中erase函数
  3. linux sort 时间排序,linux sort多字段排序实例解析
  4. 解读综合布线12大热点技术趋势
  5. Reverse Polish Notation
  6. 小猪佩奇python_一段代码画出小猪佩奇社会人 Python
  7. python7彩虹代码_Python3.7之封装
  8. vertex 3.0 与SpringBoot混合开发之初探
  9. 高德地图如何取消订单_一文教你如何爬取高德地图
  10. OfficeScan5.58升级到7.38
  11. html微博换头像,手机新浪微博头像怎么设置 手机新浪微博更换头像教程
  12. 刷题笔记(一)《王道计算机考研机试指南2》
  13. 太实用了!Schedule模块, Python 周期任务神器!
  14. 数字万用表判断绝缘栅场效应管的好坏
  15. Redis数据结构之list对象
  16. onenote怎么同步到电脑_如何同步手机和电脑 onenote
  17. 软件测试周刊(第55期):梦想养活不起你的时候,你得养着梦想啊。 ​​​
  18. RLC谐振电路简单计算公式
  19. C# 线程的挂起与唤醒 (AutoResetEvent,ManualResetEvent)
  20. 织梦防html5,织梦dedecms预防网站里的广告被浏览器阻止的方法

热门文章

  1. Android-Activity启动流程
  2. java servlet上传centos服务器
  3. Django内建模版标签和过滤器
  4. GMPC:一个 MPD 客户端
  5. 开心哲理---您的妻子! --转by yp
  6. P4213 【模板】杜教筛
  7. 无法访问gcr.io的几种解决办法
  8. 0048-三角形的判断
  9. 2017《面向对象程序设计》作业四
  10. [LeetCode]Remove Linked List Elements