MVC3学习第三章 剑出鞘之前奏控制器,URL路由

本章学习内容

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(使用自定义路由)

  1. using System.Web.Mvc;
  2. using System.Web.Routing;
  3. namespace MyApp
  4. {
  5. public class GlobalApplication : System.Web.HttpApplication
  6. {
  7. public static void RegisterRoutes(RouteCollection routes)
  8. {
  9. routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  10. routes.MapRoute(
  11. "blog",
  12. "Archive/{entryDate}",
  13. new {controller = "Archive", action = "Entry"}
  14. );
  15. routes.MapRoute(
  16. "Default", // Route name
  17. "{controller}/{action}/{id}", // URL with parameters
  18. new { controller = "Home", action = "Index", id = ""}
  19. // Parameter defaults );
  20. }
  21. protected void Application_Start()
  22. {
  23. RegisterRoutes(RouteTable.Routes);
  24. }
  25. }
  26. }

向路由表添加路由的顺序非常重要。新的自定义 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 ,另外说明一下我们的项目中将使用默认路由,如非特殊需要也不建议自定义路由

原文地址:https://www.cnblogs.com/hswh/p/3149780.html