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按钮时,地址栏中的地址变为/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内容如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- using System.Web.Routing;
- namespace MvcApplication1
- {
- // Note: For instructions on enabling IIS6 or IIS7 classic mode,
- // visit http://go.microsoft.com/?LinkId=9394801
- public class MvcApplication : System.Web.HttpApplication
- {
- 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
- );
- }
- protected void Application_Start()
- {
- RegisterRoutes(RouteTable.Routes);
- }
- }
- }
当程序运行时, 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文件。内容如下
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- namespace MvcApplication1.Controllers
- {
- [HandleError]
- 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();
- }
- }
- }
注意该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内容如下:
- < %@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
- < asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
- < h2>About< /h2>
- < p>
- Put content here.
- < /p>
- < /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文件夹下的一个新类里面。
【编辑推荐】