本章学习内容
1.强大的控制器
2.URL路由
注:请务必认真学习这一章的内容,对于MVC3来说,这是最基本而又最常用的知识,无比重要。
1.强大的控制器
在上一章中我们成功输出了我们的Hello World,MVC3的学习中实现了我们的第一个功能,但是仅仅也只是输出了一段字符串而已,离我们想要实现的目标还相去甚远,而且也没有详细解说这个Hell World输出的过程是怎么样的,接下来会一一解说。
在第二章中我们说过Controllers文件夹存放的是控制器类,是为Views提供数据来源的。
在典型的 Web 应用中,用户请求的 URL 地址通常映射到保存在网站中的文件上,例如,当用户请求 /Products.aspx 的时候,或者 /Products.php 的时候,很可能是在通过处理 Products.aspx 或者 Products.php 文件来完成任务。
ASP.NET MVC 的处理方式则不同,它没有映射到文件上,相反,将这些 URL 地址映射到类的方法上,这些类被称为“控制器”,控制器用来接受 HTTP 请求,处理用户的输入,获取或者保存数据,其中的处理方法称为 Action,然后将回应发送到客户端,可能是显示了一个 HTML 的网页,下载一个文件,重定向到另外一个地址等等
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 7 namespace MyShopTest.Controllers 8 { 9 public class HomeController : Controller 10 { 11 public ActionResult Index() 12 { 13 ViewBag.Message = "Hello World!"; 14 15 return View(); 16 } 17 18 public ActionResult About() 19 { 20 return View(); 21 } 22 } 23 }
HomeController就是一个控制器,Index是它的一个Action,About也是他的一个Action,他们二者均返回对应的数据到他们各自的View视图里,根据约定,系统默认应用程序的控制器为Home(这是由URL路由配置决定的,本文最后一个知识点会讲到),默认的Action为Index,所以用户启动应用程序会先访问Home控制器的Index Action,然后执行此Action提供的数据来显示对应的视图,就像刚才的Hello World
在此说明一下,所有的控制器均是以Controller结尾的,这既是规定亦是规范,另外视图对应的是控制器的Action而不是控制器。
2.URL路由
上述说到系统控制器默认为Home是由URL路由配置决定的,那么这个配置又在哪里呢?
打开应用程序全局文件,可以见到如下代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MyShopTest { // 注意: 有关启用 IIS6 或 IIS7 经典模式的说明, // 请访问 http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // 路由名称 "{controller}/{action}/{id}", // 带有参数的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值 ); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); } } }
其中 RegisterRoutes 方法注册了默认的路由配置,在方法中的 routes.MapRoute 语句中,请求地址将会被看成三个部分组成,{controller}/{action}/{id},第一部分称为控制器,如果没有提供的话,默认为 Home, 第二部分称为 Action 方法,如果没有提供的话,默认为 Index, 第三部分称为 id, 通常用来提供数据的标识,没有默认值。这样,当请求 / 地址的时候,系统将会把请求映射到名为 Home 的控制器进行处理,调用其中名为 Index 的方法处理请求,即Controller/Action/Parameter的顺序。
前面我们说过路由是可以自定义的,虽然这不是我们此系列教程讨论的终点,我们也在此提到一点,以便大家更好的理解URL路由以及如何访问路由规定的规则之下的控制器
Global.asax(使用自定义路由)
- using System.Web.Mvc;
- using System.Web.Routing;
- namespace MyApp
- {
- public class GlobalApplication : System.Web.HttpApplication
- {
- public static void RegisterRoutes(RouteCollection routes)
- {
- routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
- routes.MapRoute(
- "blog",
- "Archive/{entryDate}",
- new {controller = "Archive", action = "Entry"}
- );
- 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);
- }
- }
- }
向路由表添加路由的顺序非常重要。新的自定义 Blog 路由添加在现有的 Default 路由之前。如果顺序相反,则将总是调用 Default 路由,而不会调用自定义路由。
自定义 Blog 路由匹配任何以 /Archive/ 开头的请求。所以,它匹配所有下列 URL:
/Archive/12-25-2009
/Archive/10-6-2004
/Archive/apple
自定义路由将进入的请求映射到名称为 Archive 的控制器并激活 Entry() 操作。当调用 Entry() 方法时,条目日期将作为名称为 entryDate 的参数进行传递
更详细的URL路由了解建议参考此处http://www.cnblogs.com/Sandheart/archive/2011/01/23/1942391.html ,另外说明一下我们的项目中将使用默认路由,如非特殊需要也不建议自定义路由