zoukankan      html  css  js  c++  java
  • ASP.NET MVC API 路由生成规则

    我们都知道调用ASP.NET MVC的某些API函数(诸如:Url.Action、RedirectToAction等)可以生成URL,ASP.NET MVC会根据调用API函数时传入的参数去匹配系统定义的路由(Route),然后通过匹配成功的路由去生成相应的URL。

    ASP.NET MVC会依次根据如下三个规则生成URL:

    1. 调用ASP.NET MVC API函数时传入的参数信息

    2. 当前请求的URL(就是Request.Url)和系统中定义路由匹配(按照路由表定义的顺序,从上往下匹配)后的匹配值

    3. 系统定义路由中路由参数的默认值

    下面这篇文章通过一个例子来阐述ASP.NET MVC是怎么通过上面三点来生成URL。

    首先我们在MVC系统中定义了如下两个路由

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.MapRoute(
                name: "Lang",
                url: "Culture/{lang}/{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = 123 }
            );
    
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

    运行ASP.NET MVC项目时,如果我们在浏览器地址栏上输入地址http://localhost/culture/en-us/Home/Index,那么这个地址会匹配上面第一个路由Lang(因为ASP.NET MVC的路由表是从上往下匹配的,如果某个路由匹配成功就不会再往下匹配了)。

    如果我们现在在http://localhost/culture/en-us/Home/Index这个地址运行的View上(也就是HomeController下的Index这个View),调用Url.Action生成URL:

    <!DOCTYPE html>
    
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Index</title>
    </head>
    <body>
        <div> 
            @Url.Action("DoSomething")
        </div>
    </body>
    </html>

    那么我们来看看调用API时,ASP.NET MVC生成URL的步骤:

    1.由于在调用API Url.Action时传入了参数DoSomething,所以路由中可以得到参数Action为DoSomething。

    Action:DoSomething

    2.当前请求的URL是http://localhost/culture/en-us/Home/Index,那么用这个地址从上往下去匹配系统定义的路由,匹配到第一个路由Lang时我们可以得到两个参数信息,Controller为Home,lang为en-us,那么现在我们得到的路由信息有:

    Controller:HomeController

    Action:DoSomething

    lang:en-us

    3.由于路由Lang中,我们定义了参数id有默认值123,所以最后我们得到的路由信息如下:

    Controller:HomeController

    Action:DoSomething

    lang:en-us

    id:123

    现在根据最后得到的路由信息再去从上到下匹配系统定义的路由,那么首先匹配到路由Lang时,MVC发现Lang中每个路由参数现在都有值了,匹配成功,所以根据Lang生成的URL就如下图所示(注意:参数id由于是路由Lang中定义的默认值,所以最后没有在生成的URL中体现出来)

  • 相关阅读:
    predis操作
    mysql 笔记(转载)
    mysql 汉字根据首字母排序
    sql 优化
    update多条不同数据
    解决network is unreachable问题
    开启服务器端口
    数据库开启远程访问
    激活2021.2.1idea
    python向excel追加数据
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/4930165.html
Copyright © 2011-2022 走看看