zoukankan      html  css  js  c++  java
  • URL 路由简介

    URL 路由简介

    在本教程中,将介绍对于每个 ASP.NET MVC 应用程序都非常重要的 URL 路由功能。URL 路由模型负责将进入的浏览器请求映射到特定的 MVC 控制器操作。

    在本教程的第一部分中,我们将学习标准路由表如何将请求映射到控制器操作。在本教程的第二部分中,我们将学习如何使用自定义路由修改默认的路由表。

    使用默认路由表

    在创建新的 ASP.NET MVC 应用程序时,应用程序已配置好使用 URL 路由。URL 路由在两个位置设置。

    第一,URL 路由在应用程序的 Web 配置文件(Web.config 文件)中启用。在配置文件中有 4 个部分与路由有关:system.web.httpModules 部分,system.web.httpHandlers 部分,system.webserver.modules 部分和 system.webserver.handlers 部分。注意不要删除这些部分,因为没有这些部分路由就无法工作。

    第二,但是更重要的位置,就是在应用程序中创建路由表的 Global.asax 文件。Global.asax 文件是一个特殊文件,它包含 ASP.NET 应用程序生命周期事件的事件处理程序。路由表是在 Application Start 事件中创建的。

    程序清单 1 中的文件包含 ASP.NET MVC 应用程序的默认 Global.asax 文件。

    程序清单 1 Global.asax.cs

    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 MyApp
    9. {
    10.      public class GlobalApplication : System.Web.HttpApplication
    11.      {
    12.           public static void RegisterRoutes(RouteCollection routes)
    13.           {
    14.                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    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.  
    22.           protected void Application_Start()
    23.           {
    24.                RegisterRoutes(RouteTable.Routes);
    25.           }
    26.      }
    27. }

    当 ASP.NET 应用程序第一次启动时,调用 Application_Start() 方法。此方法将调用 RegisterRoutes() 方法。RegisterRoutes() 方法创建路由表。

    默认路由表包含一个路由(名称为 Default)。Default 路由将 URL 的第一段映射到控制器名称,将第二段映射到控制器操作,将第三段映射到名称为 id 的参数。

    假设将下面的 URL 输入到 Web 浏览器的地址栏:

    /Home/Index/3

    Default 路由将此 URL 映射为下列参数:

    controller = Home

    action = Index

    id = 3

    在请求 URL /Home/Index/3 时,执行下面的代码:

    HomeController.Index(3)

    Default 路由包括三个参数的默认值。如果不提供控制器,则控制器参数默认为值 Home。如果不提供操作,则操作参数默认为值 Index。最后,如果不提供 id,则 id 参数默认为空字符串。

    让我们看几个例子,了解 Default 路由将 URL 映射到控制器操作的方式。假设将下面的 URL 输入到 Web 浏览器的地址栏:

    /Home

    由于 Default 路由参数的默认值,输入此 URL 将导致调用程序清单 2 中的 HomeController 类的 Index() 方法。

    程序清单 2 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 MyApp.Controllers
    8. {
    9.      [HandleError]
    10.      public class HomeController : Controller
    11.      {
    12.           public ActionResult Index(string Id)
    13.           {
    14.                return View();
    15.           }
    16.      }
    17. }

    在程序清单 2 中,HomeController 类包含名称为 Index() 的方法,此方法接受一个名称为 id 的参数。URL /Home 导致调用具有空字符串的 Index() 方法作为 id 参数的值。

    由于 ASP.NET MVC Framework 激活控制器操作的方式,URL /Home 也可匹配程序清单 3 中的 HomeController 类的 Index() 方法。

    程序清单 3 HomeController.cs(没有参数的 Index 操作)

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Web;
    5. using System.Web.Mvc;
    6.  
    7. namespace MyApp.Controllers
    8. {
    9.      [HandleError]
    10.      public class HomeController : Controller
    11.      {
    12.           public ActionResult Index()
    13.           {
    14.                return View();
    15.           }
    16.      }
    17. }

    程序清单 3 中的 Index() 方法不接受任何参数。URL /Home 将导致调用 Index() 方法。URL /Home/Index/3 也激活此方法(忽略 Id)。

    URL /Home 还可匹配程序清单 4 中的 HomeController 类的 Index() 方法。

    程序清单 4 HomeController.cs(带有可以为空的参数的 Index 操作)

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Web;
    5. using System.Web.Mvc;
    6.  
    7. namespace MyApp.Controllers
    8. {
    9.      [HandleError]
    10.      public class HomeController : Controller
    11.      {
    12.           public ActionResult Index(int? id)
    13.           {
    14.                return View();
    15.           }
    16.      }
    17. }

    在程序清单 4 中,Index() 方法有一个 Integer 参数。因为参数可以为空(值可以是 Nothing),所以可以在不引起错误的情况下调用 Index()

    最后,使用 URL /Home 激活程序清单 5 中的 Index() 方法将导致异常,因为 Id 参数不是可以为空的参数。如果试图激活 Index() 方法,则将得到如图 1 所示的错误页。

    程序清单 5 HomeController.cs(带有 Id 参数的 Index 操作)

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Web;
    5. using System.Web.Mvc;
    6.  
    7. namespace MyApp.Controllers
    8. {
    9.      [HandleError]
    10.      public class HomeController : Controller
    11.      {
    12.           public ActionResult Index(int id)
    13.           {
    14.                return View();
    15.           }
    16.      }
    17. }

    图 1:激活需要参数值的控制器操作( 单击查看大图

    另一方面,URL /Home/Index/3 可以与程序清单 5 中的 Index 控制器操作配合工作。请求 /Home/Index/3 导致调用带有值为 3 的 Id 参数的 Index() 方法。

    创建自定义路由

    对许多简单的 ASP.NET MVC 应用程序来说,使用默认的路由表就可以了。然而,您也可能会有特殊的路由需求。在这种情况下,应该创建自定义路由。

    例如,假设正在创建博客应用程序。需要处理如下所示的进入请求:

    /Archive/12-25-2009

    当用户输入此请求时,想返回日期为 12/25/2009 的博客条目。为了处理这种类型的请求,需要创建自定义路由。

    程序清单 6 中的 Global.asax 文件包含一个新的自定义路由,名称为 Blog,它处理形如 /Archive/条目日期的请求。

    程序清单 6 Global.asax(使用自定义路由)

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

    向路由表添加路由的顺序非常重要。新的自定义 Blog 路由添加在现有的 Default 路由之前。如果顺序相反,则将总是调用 Default 路由,而不会调用自定义路由。

    自定义 Blog 路由匹配任何以 /Archive/ 开头的请求。所以,它匹配所有下列 URL:

    /Archive/12-25-2009

    /Archive/10-6-2004

    /Archive/apple

    自定义路由将进入的请求映射到名称为 Archive 的控制器并激活 Entry() 操作。当调用 Entry() 方法时,条目日期将作为名称为 entryDate 的参数进行传递。

    可以将 Blog 自定义路由用在程序清单 7 中的控制器上。

    程序清单 7 ArchiveController.cs

    1. using System;
    2. using System.Web.Mvc;
    3.  
    4. namespace MyApp.Controllers
    5. {
    6.      public class ArchiveController : Controller
    7.      {
    8.           public string Entry(DateTime entryDate)
    9.           {
    10.                return "You requested the entry on " + entryDate.ToString();
    11.           }
    12.      }
    13. }

    请注意,程序清单 7 中的 Entry() 方法接受 DateTime 类型的参数。ASP.NET MVC Framework 可以智能地将 URL 中的条目日期自动转换为 DateTime 值。如果无法将 URL 中的条目日期转换为 DateTime,则将给出错误消息。

    总结

    本教程的目的是向读者简单介绍 URL 路由。首先,我们研究了新的 ASP.NET MVC 应用程序中的默认路由表。了解了默认路由如何将 URL 映射到控制器操作。

    接下来,我们了解了如何创建自定义路由。学习了如何向表示博客条目的 Global.asax 文件添加自定义路由。我们讨论了如何将对博客条目的请求映射到名称为 ArchiveController 的控制器和名称为 Entry() 的控制器操作。


    http://msdn.microsoft.com/zh-cn/dd320290
  • 相关阅读:
    2020/10/23-大族激光
    Windows权限维持总结
    了解蓝军--jsonhijack漏洞学习
    white-space、word-break、word-wrap傻傻分不清楚
    Vue其他指令(v-cloak和v-text,v-html,v-pre,v-once)
    Vue循环渲染(v-for)
    Vue条件渲染(v-if)
    Vue绑定事件监听器(v-on)
    Vue绑定数据和元素属性(v-bind)
    记录一下,破解idea
  • 原文地址:https://www.cnblogs.com/Sandheart/p/1942391.html
Copyright © 2011-2022 走看看