zoukankan      html  css  js  c++  java
  • 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 ,另外说明一下我们的项目中将使用默认路由,如非特殊需要也不建议自定义路由

  • 相关阅读:
    Qt初始化窗口大小
    Ignatius's puzzle(数学)
    无法定位程序输入点_Z5qFreePv于动态链接库QtCore4.dll
    Harmonic Number(打表法)
    Codeforces Round #170 (Div. 2) C. Learning Languages(并查集)
    Codeforces Round #174 (Div. 2) B. Cows and Poker Game(简单)
    Codeforces Round #175 (Div. 2) B. Find Marble(简单模拟)
    错误:no matching function for call to 'Ui_***::retranslateUi()'
    最大流EK算法模板(BFS实现)
    Shaking Your Cellphone(并查集)
  • 原文地址:https://www.cnblogs.com/hswh/p/3149780.html
Copyright © 2011-2022 走看看