学习ASP.NET MVC的基本概念

开发 后端
本文介绍了学习ASP.NET MVC中的一些最基本的概念:controller,Views以及Models。visual studio用于创建mvc的模板默认包含了一个极其简单的mvc例子。通过这个例子你可以了解mvc应用的不同部分组成。

visual studio用于创建mvc的模板默认包含了一个极其简单的mvc例子。通过这个例子你可以了解mvc应用的不同部分组成。这里我们利用这个简单的例子进行ASP.NET MVC基本概念的学习。

首先创建mvc应用。这里我们还是不选择添加测试项目。

创建成功后,可以看到一些文件夹和文件。你需要对Models,Views,Controllers这三个文件夹特别关注。顾名思义,这三个文件夹内包含了m,v,c中的文件。

展开controllers文件夹,我们可以看到一个叫做AccountController.cs的文件和一个HomeController.cs文件。Views文件夹下可以看到三个子文件夹 Account, Home and Shared。展开Home文件夹,看到两个文件About.aspx 和Index.aspx 。这些文件组成了我们这个mvc简单的实例。文件结构如下图

文件结构 

按F5运行这个项目,如果是第一次运行,会提示启动调试模式对话框。选择确定。

这个简单的项目只含有两个页面:Index和About,当程序第一次运行的时候,浏览器呈现的是index页面,可以通过右上部的导航定位到About页面。

可以通过右上部的导航定位到About页面 

注意地址栏中的地址。例如:当你点击About按钮时,地址栏中的地址变为/Home/About.

关掉浏览器回到VS,你不会在/Home/About目录中找到任何文件,这些文件是在该目录是不存在的,但是为什么会这样呢?

ASP.NET MVC基本概念:一个URL不等于一个页面

当你创建一个asp程序或asp.net web窗体程序时,一个URL和一个页面是一一对应的。如果你向服务器请求一个页面somepage.aspx,服务器磁盘上应该有一个页面叫做somepage.aspx,如果somepage.aspx不存在,你会得到一个404错误提示。

但是mvc程序相比之下,你在地址栏中写入的地址与项目中的文件并不是一一对应的。在mvc程序中,一个URL相当于一个controller action,并不是一个aspx页面。

在传统的aspx程序中,浏览器请求被映射到页面,在mvc程序中,浏览器请求被映射到controller action。web窗体应用是以内容为中心,mvc应用以程序逻辑为中心。

学习asp.net mvc 路径

浏览器请求得到一个由asp.net framework中叫做asp.net routing机制映射的controller action。asp.net routing被mvc框架用来为正在到达的请求选择一个路径指向controller action。

asp.net routing用一个路由表(route Table)来提交请求。这个路由表在程序第一次运行的时候就已经产生了。route table在global.asax文件中被定义。默认global.asax内容如下:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.Mvc;  
  6. using System.Web.Routing;  
  7.  
  8. namespace MvcApplication1  
  9. {  
  10.     // Note: For instructions on enabling IIS6 or IIS7 classic mode,   
  11.     // visit http://go.microsoft.com/?LinkId=9394801  
  12.  
  13.     public class MvcApplication : System.Web.HttpApplication  
  14.     {  
  15.         public static void RegisterRoutes(RouteCollection routes)  
  16.         {  
  17.             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");  
  18.  
  19.             routes.MapRoute(  
  20.                 "Default",                                              // Route name  
  21.                 "{controller}/{action}/{id}",                           // URL with parameters  
  22.                 new { controller = "Home", action = "Index", id = "" } // Parameter defaults  
  23.             );  
  24.  
  25.         }  
  26.  
  27.         protected void Application_Start()  
  28.         {  
  29.             RegisterRoutes(RouteTable.Routes);  
  30.         }  
  31.     }  
  32. }  

当程序运行时, Application_Start()方法就被调用,在上面代码中, Application_Start()方法调用RegisterRoutes()方法,RegisterRoutes()创建默认路由表。

默认路由表由一条路由组成。这条路由把一个正在进行的请求分成三个部分。第一部分的URL被映射到controller,第二部分URL被映射到action,最后一部分用来给action传递参数id。例如

假设下面的url:/Product/Details/3

这个url被分解成三个部分:controller=product,action=details,id=3

在global.asax文件中定义的默认路由包含这三个参数的默认值。默认controller为Home,默认action为Index,默认id为空。有了上面的知识做基础,来分析下面这个url

/Employee

分解成三部分为controller=employee,action=Index,id=空。

最后,如果我们打开一个mvc应用不写任何的路径(如http://localhost),那么,这个路径被解析成下面的三部分

controller=Home,action=Index,id=。

请求被映射到Homecontroller中的Index()action。

学习ASP.NET MVC:理解controllers

一个controller对一个用户与mvc应用交互的方式负责。controller包含mvc应用的流控制逻辑。controller决定了当用户请求后返回给用户一个什么内容。

controller仅仅是一个类(C#或VB class),这个mvc简单例子包括一个位于controllers文件夹下的HomeController.cs文件。内容如下

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.Mvc;  
  6.  
  7. namespace MvcApplication1.Controllers  
  8. {  
  9.     [HandleError]  
  10.     public class HomeController : Controller  
  11.     {  
  12.         public ActionResult Index()  
  13.         {  
  14.             ViewData["Title"] = "Home Page";  
  15.             ViewData["Message"] = "Welcome to ASP.NET MVC!";  
  16.  
  17.             return View();  
  18.         }  
  19.  
  20.         public ActionResult About()  
  21.         {  
  22.             ViewData["Title"] = "About Page";  
  23.  
  24.             return View();  
  25.         }  
  26.     }  
  27. }  

注意该controller下含有Index和About两个方法。这两个方法就是controller提供的公共的两个action。/Home/Index这个路径就会引用这个controller中的Index()方法。同理About()也是这样。

在controller中的任何公共方法都被当做一个controller action。对此要非常小心。这就意味着在controller下面的任何公共方法都可以被互联网上输入了正确URL的浏览器所访问到。

学习ASP.NET MVC:理解Views

上面两个Action同时都返回了view,view包含了html标记与被送往客户浏览器的内容。在mvc应用中,view就相当于一个页面。我们必须在合适的位置创建相应的view。HomeController.Index() 返回一个在下列目录中的view:\Views\Home\Index.aspx,The HomeController.About()则返回\Views\Home\About.aspx。

一般,如果想为一个controller返回一个view,你需要在Views目录下新建子目录,并以controller同名,在这个子目录中,必须建立一个aspx页面,并以controller action同名。

如About.aspx内容如下:

  1. < %@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> 
  2.  
  3. < asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server"> 
  4.     < h2>About< /h2> 
  5.     < p> 
  6.         Put content here.  
  7.     < /p> 
  8. < /asp:Content> 

如果我们忽略掉第一行,剩下View中的大部分都由标准HTML组成。我们可以修改这个View用我们想要的HTML代码。

View与asp和aspx web窗体十分类似。可以包括HTML和script内容。你可以根据自己的喜好的.net语言写脚本(c#或VB),通过这些脚本,我们可以呈现动态数据,如数据库数据。

学习ASP.NET MVC:理解Models

controller和Views都讨论完了,最后我们要讨论一下最后一个ASP.NET MVC基本概念:Models。mvc Models是什么呢?

Models包含了在controller和Views中没有实现的所有的应用逻辑。Models应该包含所有的应用业务逻辑,认证逻辑,数据访问逻辑。例如:如果使用了Microsoft Entity Framework 来实现数据访问,就需要在Models文件夹下建立Microsoft Entity Framework类的.edmx 文件。

View应该只包含与用户界面有关的逻辑。controller应该只包含转到正确View或转到其他action的逻辑。其他的东西都应该放在Models下面。

一般,我们需要向“胖”Models和“瘦”controllers努力。controller方法应该只含有少量的几行代码就可以。如果一个controller很“胖”,你则需要考虑将逻辑移到models文件夹下的一个新类里面。

【编辑推荐】

  1. 浅谈ASP.NET MVC框架
  2. ASP.NET的AsyncState参数
  3. ASP.NET MVC执行异步Action
  4. 概述ASP.NET MVC框架
  5. ASP.NET MVC中使用UpdataModel方法
责任编辑:yangsai 来源: 百度空间
相关推荐

2009-08-04 12:59:42

ASP.NET控件开发

2009-04-20 09:43:37

ASP.NET MVC基础开发

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-31 12:43:59

ASP.NET MVC

2009-07-22 15:02:02

ASP.NET MVC

2009-07-22 10:34:37

ActionInvokASP.NET MVC

2009-07-28 15:03:02

依赖性注入

2009-07-20 15:44:32

ASP.NET MVC

2009-07-22 09:11:02

Action方法ASP.NET MVC

2015-01-07 09:32:50

ASP.NET MVC路由

2009-07-22 13:24:24

ASP.NET MVC

2009-07-20 10:53:59

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-28 17:17:19

ASP.NET概述

2011-09-22 10:58:56

ASP.NET

2009-08-04 12:29:57

ViewState概念ASP.NET

2009-07-20 12:59:53

ASP.NET MVCASP.NET框架的功

2009-07-22 13:16:04

MvcAjaxPaneASP.NET MVC
点赞
收藏

51CTO技术栈公众号