[聚合文章] ASP.NET MVC路由——没人告诉你的事

.Net 2018-01-24 7 阅读

路由是URL到处理该URL的逻辑的映射。在经典ASP.NET窗体网站中,路由并不那么令人感兴趣,因为经典ASP.NET窗体网站的URL直接映射到aspx文件,如https://gqqnbig.me/default.aspx就由default.aspx执行。

ASP.NET MVC的主要特性之一就是URL与具体的处理程序解耦了,处理程序称为Controller控制器,即MVC的C。不要以为URL不重要,用户用URL来探索站点结构。例如本文的URL是 https://gqqnbig.me/2018/01/23/asp-net-mvc路由-没人告诉你的事/ ,用户期望删除后面部分,使用 https://gqqnbig.me/2018/01/23/ 到达日度归档。另一方面,结构化的URL有助于搜索引擎优化。

既然路由是URL到处理控制器的映射,我们需要URL模式和控制器两者来定义一个路由。在Visual Studio中新建.NET Framework ASP.NET MVC应用程序,Global.asax.cs里有

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

RouteConfig.RegisterRoutes(RouteTable.Routes) 要求在应用程序启动时注册路由表,该方法的方法体为。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//(1)

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

对于(1)的作用,所有文章要么没解释,要么用同一句话解释 [1] huangenai. asp.net MVC 5 路由 Routing . . 2017-07-26 [2018-01-23].

[2]

:不对.axd文件进行路由。但读者仍然不知道{resource}、”*”、斜杠的意思。

URL模式

路由需要定义URL模式,URL模式包含常量值、 URI片段分隔符 (斜杠)和占位符。

占位符由成对的大括号标记,如 {resource}{id} 。两个占位符之间必须有常量值或斜杠,如 {language}{country}/{action} 不是合法的URL模式,而 {language}-{country}/{action} 是。占位符类似于变量,其名字是任意的,只要变量调用方调用正确的名字。下列URL模式具有完全相同的功能。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{x}.axd/{*y}");
routes.IgnoreRoute("{hello}.axd/{*word}");

URI片段分隔符在 Uri.Segments 属性 有介绍,用于把URI(即URL)划分成不包括斜杠的片段。由定义可知,第一个URI片段永远为 /

URL URI片段
http://www.contoso.com/Chapters/Chapter1/Sections/Section1.htm#page1?answer=NO
  1. Chapters
  2. Chapter1
  3. Sections
  4. Section1.htm
https://www.google.com
https://www.google.com/

此外,URI片段分隔符不能连续出现,否则将抛出异常。

在路由过程中,不是URL与URL模式直接匹配,而是URL片段与URL模式片段匹配。

占位符中的星号(*)将该占位符标识为 变长占位符 (Catch-all placeholder),变长意思是允许匹配多个或零个URI片段。使用 {resource}.axd/{*pathInfo} 对下列URL进行匹配,占位符的捕获情况如下。

URL URI片段
https://gqqnbig.me/WebResource.axd?d=PhPk80h_UWEcbheb&t=632573240669964903 resource=WebResource
pathInfo=空字符串
https://gqqnbig.me/ScriptResource.axd/underscore/1.0 resource=ScriptResource
pathInfo=underscore/1.0
https://gqqnbig.me/aspnet/ScriptResource.axd/underscore/1.0 不匹配

参考资料

Peter Johnson. MVC's IgnoreRoute syntax

. . 2010-11-11 [2018-01-23].

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。