日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET MVC教程五:ASP.NET MVC中的路由

發布時間:2024/7/5 asp.net 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC教程五:ASP.NET MVC中的路由 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概述

在ASP.NET MVC架構中,控制器在3大核心構件中處于中心地位,通過控制器支配模型和視圖,然而從瀏覽器發出的請求到控制器還需要路由的協助,路由將特定的請求和控制器的動作對應起來。

在ASP.NET MVC程序中,路由主要有兩方面的職責:

  • 與入站的請求相匹配,將這些請求映射到控制器的動作中。
  • 構造出站的URL,這些URL可以響應控制器的動作。
  • 二、路由原理

    1、注冊路由

    先看Global.asax中的代碼:

    網站啟動的時候執行Application_Start方法,通過RouteConfig.RegisterRoutes(RouteTable.Routes)這段代碼進行路由的注冊,在RegisterRoutes上面F12轉到定義,可以查看該方法,其實就是App_Start文件夾下面的RouteConfig類,該類定義如下:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing;namespace ASPNETMVCDemo {/// <summary>/// RouteCollection 所有路由的集合/// </summary>public class RouteConfig{public static void RegisterRoutes(RouteCollection routes){// 表示忽略路由 只要URL滿足這個正則規則,就不使用路由// .axd 是因為iis6給沒有后綴的請求加個asd,然后支持MVC的請求routes.IgnoreRoute("{resource}.axd/{*pathInfo}");// 默認路由規則// 里面使用的是命名參數,順序可以改變 routes.MapRoute(// 路由名稱 RouteCollection是個字典 每個路由都要有自己的名稱,相同名稱的路由會被覆蓋name: "Default",// url的正則規則,去掉域名和端口后的地址進行匹配url: "{controller}/{action}/{id}",// 默認值defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}} }

    注冊路由其實就是把路由規則添加到RouteCollection路由集合中。

    解釋說明:

  • RegisterRoutes方法是在應用程序啟動時(Application_Start)被調用執行的。
  • RegisterRoutes方法的作用:注冊路由。它的參數是一個集合對象,這個集合對象就是用來保存多項路由數據的。一項路由數據實際上就是某種形式的URL路徑和控制器及其Action的關系,根據這個關系,MVC才能執行到控制器。
  • 那么怎么添加這種路由數據呢?即調用RegisterRoutes方法里面的routes.MapRoute方法。該方法的第一個參數是路由的名稱,類似于Dictionary字典里面的key。第二個參數表示的是URL或者是地址。第三個參數是一個匿名類型,表示該路由相關的默認數據,可以看作一個字典。
  • 我們注意到第二個參數其實就是占位符表示的URL,這個占位符是用大括號和里面的字符串表示的。可以看出里面不是某種硬編碼的URL地址(這里的controller代表所有的控制器,而不是某一個具體的控制器。同理,action也是代表所有的方法,而不是某一個具體的action方法),這樣就增加了靈活性,就是用“/”把URL分成三部分。還有我們注意到占位符表示的URL是沒有域名的,這個是允許的,這種匹配是不考慮域名的。
  • 在ASP.NET MVC中我們見得最多的是“{controller}/{action}/{id}”這種形式的URL,那么controller和action這兩個單詞是否有特殊的用途呢,能不能改變這兩個單詞的寫法。答案是不能的。這時因為會把controller、action和id當做字典或集合的key值來存儲對應的URL片段,這樣框架在處理時,會讀取鍵名為controller的數據,比如Home,然后得到要執行的控制器是HomeController。同樣會從字典中讀取鍵名為action的數據,比如Index,然后得到要執行的Action方法是Index。如果這兩個單詞寫錯了,就執行不到相應的controller和action方法了。所以一定要記住寫成controller和action是一種約定,其他參數的定義就沒有這種要求了。但是action和controller的位置可以修改。
  • 啟動程序,這時URL地址是:http://localhost:49730

    其實該地址相當于在瀏覽器里面輸入:http://localhost:49730/Home/Index,這時因為在路由規則里面設置了默認值,如果沒有控制器和action方法,則默認是Home控制器下面的Index方法。

    修改URL里面的controller和action,代碼如下:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing;namespace ASPNETMVCDemo {/// <summary>/// RouteCollection 所有路由的集合/// </summary>public class RouteConfig{public static void RegisterRoutes(RouteCollection routes){// 表示忽略路由 只要URL滿足這個正則規則,就不使用路由// .axd 是因為iis6給沒有后綴的請求加個asd,然后支持MVC的請求routes.IgnoreRoute("{resource}.axd/{*pathInfo}");// 默認路由規則// 里面使用的是命名參數,順序可以改變 routes.MapRoute(// 路由名稱 RouteCollection是個字典 每個路由都要有自己的名稱,相同名稱的路由會被覆蓋name: "Default",// url的正則規則,去掉域名和端口后的地址進行匹配url: "{controller1}/{action1}/{id}",// 默認值defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}} }

    ?然后運行程序查看結果:

    這時程序運行出錯,所以說controller和action千萬不能寫錯。把controller和action改回正確的,然后顛倒controller和action的位置,代碼如下:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing;namespace ASPNETMVCDemo {/// <summary>/// RouteCollection 所有路由的集合/// </summary>public class RouteConfig{public static void RegisterRoutes(RouteCollection routes){// 表示忽略路由 只要URL滿足這個正則規則,就不使用路由// .axd 是因為iis6給沒有后綴的請求加個asd,然后支持MVC的請求routes.IgnoreRoute("{resource}.axd/{*pathInfo}");// 默認路由規則// 里面使用的是命名參數,順序可以改變 routes.MapRoute(// 路由名稱 RouteCollection是個字典 每個路由都要有自己的名稱,相同名稱的路由會被覆蓋name: "Default",// url的正則規則,去掉域名和端口后的地址進行匹配url: "{action}/{controller}/{id}",// 默認值defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}} }

    ?在運行程序查看結果:

    這說明:controller和action的位置是可以顛倒的。這時如果想輸入完整的URL地址就行訪問就應該輸入:http://localhost:49730/Index/Home。

    2、路由匹配

    2.1、匹配方式一

    看下面的截圖:

    解釋說明:

  • {parameter}:花括弧加任意長度的字符串表示模糊匹配,字符串不能定義成controller和action。默認路由規則就是使用模糊匹配,沒有指明具體是哪個控制器里面的哪個action方法。
  • 字面量即一個常數字符串,這個字符串可以在大括弧與大括弧之間,也可以在最前面或最后面。
  • 兩個大括弧之間沒有任何的字面量是不可以的。
  • ?看下面的示例:

    首先修改Home控制器里面的Index方法,修改后的代碼如下:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc;namespace ASPNETMVCRoute.Controllers {public class HomeController : Controller{public ActionResult Index(){string paras = "";// 遍歷獲取參數值foreach(KeyValuePair<string,object> keyValue in RouteData.Values){paras += string.Format($"{keyValue.Key}={keyValue.Value} ");}// 通過ViewData向頁面傳值ViewData["msg"] = paras;return View();}public ActionResult About(){ViewBag.Message = "Your application description page.";return View();}public ActionResult Contact(){ViewBag.Message = "Your contact page.";return View();}} }

    ?修改對應的視圖,在界面展示ViewData["msg"]的值:

    @{ViewBag.Title = "Home Page"; }<div class="jumbotron"><h1>ASP.NET</h1><p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p><p><a href="https://asp.net" class="btn btn-primary btn-lg">Learn more &raquo;</a></p><!--展示ViewData["msg"]的值--><p style="color:red;">@ViewData["msg"]</p></div><div class="row"><div class="col-md-4"><h2>Getting started</h2><p>ASP.NET MVC gives you a powerful, patterns-based way to build dynamic websites thatenables a clean separation of concerns and gives you full control over markupfor enjoyable, agile development.</p><p><a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkId=301865">Learn more &raquo;</a></p></div><div class="col-md-4"><h2>Get more libraries</h2><p>NuGet is a free Visual Studio extension that makes it easy to add, remove, and update libraries and tools in Visual Studio projects.</p><p><a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkId=301866">Learn more &raquo;</a></p></div><div class="col-md-4"><h2>Web Hosting</h2><p>You can easily find a web hosting company that offers the right mix of features and price for your applications.</p><p><a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkId=301867">Learn more &raquo;</a></p></div> </div>

    ?1、使用{parameter}做模糊匹配其實就是默認路由規則:

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

    ?運行程序查看結果:

    2、使用字面量做精確匹配

    路由規則如下代碼所示:

    routes.MapRoute(name: "const",url: "admin/{controller}/{action}" );

    ?運行程序,在瀏覽器里面輸入:http://localhost:64957/admin/home/index,運行結果如下:

    3、不允許連續的URL參數

    路由規則如下:

    routes.MapRoute(name: "blx",// 錯誤的URL// url: "{language}{country}/{controller}/{action}"url: "{language}-{country}/{controller}/{action}" );

    運行程序,URL里面輸入:http://localhost:64957/chinese-china/home/index,運行結果如下:

    2.2、匹配方式二

    看下面截圖:

    解釋說明:

  • 使用“*”來匹配URL剩余的部分,如*plus放在一個表達式的尾部,最后尾部的URL會保存為plus為鍵名的字典值。
  • 看下面的路由規則:

    routes.MapRoute(name: "RouteRule",url: "{controller}/{action}/{query-name}/{*plus}" );

    ?運行程序,在URL里面輸入:http://localhost:64957/home/index/123/wqer_1234,運行結果如下:

    2.3、匹配方式三

    看下面截圖:

    解釋說明:

  • 在URL表達式中有一種特殊的情況,就是URL表達式可能和實際的URL有多種匹配情況,這時候遵守貪婪匹配的原則(即從后往前進行匹配)。
  • 路由規則1:

    routes.MapRoute(name: "tlppone",url: "{controller}/{action}/{filename}.{ext}" );

    ?運行程序,在URL里面輸入:http://localhost:64957/home/index/2342.234.234.aspx,運行結果如下:

    路由規則2:

    routes.MapRoute(name: "tlpptwo",url: "{controller}/{action}/{foo}xyz{bar}" );

    ?運行程序,在URL里面輸入:http://localhost:64957/home/index/xyzxyzxyzwer23,運行結果如下:

    完整路由規則代碼如下:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing;namespace ASPNETMVCRoute {public class RouteConfig{public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");// 使用字面量做精確匹配// http://localhost:64957/admin/home/index routes.MapRoute(name: "const",url: "admin/{controller}/{action}");// 不允許連續的URL參數// http://localhost:64957/chinese-china/home/index routes.MapRoute(name: "blx",// 錯誤的URL// url: "{language}{country}/{controller}/{action}"url: "{language}-{country}/{controller}/{action}");// 使用*號匹配URL剩余部分// http://localhost:64957/home/index/2342.234.234.aspx 與第一個和第二個路由規則都匹配,顯示第一個,說明路由匹配的順序是從上往下// http://localhost:64957/home/index/123/wqer_1234 routes.MapRoute(name: "RouteRule",url: "{controller}/{action}/{query-name}/{*plus}");// 貪婪匹配// http://localhost:64957/home/index/2342.234.234.aspx routes.MapRoute(name: "tlppone",url: "{controller}/{action}/{filename}.{ext}");// 貪婪匹配2// http://localhost:64957/home/index/xyzxyzxyzwer23 routes.MapRoute(name: "tlpptwo",url: "{controller}/{action}/{foo}xyz{bar}");routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}} }

    3、URL參數默認值

    3.1、參數默認值一

    看下面的截圖:

    解釋說明:

  • 如上圖所示,我們使用了參數的默認值,上圖下方的URL都是匹配這個路由的,如果沒有使用默認值,那么就只能使用http://localhost/home/index/1這種完整形式的URL地址了。
  • 路由規則代碼如下:

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

    3.2、參數默認值二

    看下面截圖:

    解釋說明:

  • 首先我們說的路由項只提供部分URL片段默認值的情況,一條規則就是如果在路由項中使用默認值,但是沒有提供全部默認值,那么沒有提供默認值的必須通過URL提供。在上面截圖中,控制器必須在URL里面提供。
  • 路由規則如下:

    // 參數默認值二:默認值不提供的必須通過URL提供 routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { action = "Index", id = UrlParameter.Optional });

    ?這時直接運行程序,因為沒有提供controller,所以程序會報錯:

    然后在URL里面輸入:http://localhost:55650/Home,就可以正常訪問了:

    3.4、參數默認值三

    解釋說明:

  • 如果只提供了部分參數,而且提供的部分參數是URL表達式中間的,如上圖所示,這種情況下action是不起作用的,所以,這種定義默認值的方式是沒有意義的!
  • 路由規則如下:

    // 參數默認值三:只提供中間參數的默認值是不起作用的 routes.MapRoute(name: "Default2",url: "{controller}/{action}/{id}",defaults: new { action = "Index" } );

    ?

    這時候需要在瀏覽器里面輸入完整的URL才能訪問。

    3.4、參數默認值四

    看下面截圖:

    解釋說明:

  • 最后一種默認值的特殊情況,就是在URL表達式中使用字面量,注意這個字面量是除-之外的任意字符的組合,那么字面量相鄰的URL參數的默認值是不起作用的。
  • 規律:使用/把URL劃分成若干個部分,如果各個部分包含了URL參數和字面量,那么給這些URL參數提供默認值是不起作用的。如圖所示,給參數2和參數3是不起作用的!

  • 路由規則如下:

    // 參數默認值四:只提供中間參數的默認值是不起作用的 routes.MapRoute(name: "Default2",url: "{controller}-{action}",defaults: new { action = "Index" });

    運行程序,如果瀏覽器里面只輸入http://localhost:55650/home-?是報錯的:

    這時需要輸入完整的URL地址:http://localhost:55650/home-index

    4、參數值約束

    ?假如我們想對URL后面的數字進行限制,比如四位數字或者兩位數字,如下圖所示,該如何限制呢?

    1、使用正則表達式

    如下圖所示:

    解釋說明:

  • 在MVC的路由中我們可以對URL的各個參數定義約束,有兩種約束方法,第一種是使用正則表達式,如上圖所示。
  • MapRoute提供了一個重載方法,就是在默認值后面增加了一個約束的參數,這個參數可以使用匿名類型設置值,在匿名類里面可以設置各種參數對應的正則表達式,如上圖所示。
  • 路由規則如下:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing;namespace MVCURLParaConstraint {public class RouteConfig{public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");// 1、使用正則表達式設置參數值的約束 routes.MapRoute(name: "Default1",url: "{controller}/{action}/{id}/{year}/{month}/{day}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },// year是4位整數 month和day是2位整數constraints:new { year = @"\d{4}",month=@"\d{2}",day=@"\d{2}"});// 默認路由 routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}} }

    ?運行程序,在瀏覽器里面輸入:http://localhost:51244/Home/Index/1/2019/05/24,效果如下:

    因為設置了約束month是2位整數,這時將month改為1位整數,然后輸入:http://localhost:51244/Home/Index/1/2019/5/24,效果如下:

    這時程序就報錯了,說明設置的正則約束起作用了。

    2、使用約束類

    如下圖所示:

    解釋說明:

  • 在有些時候,如果約束規則很復雜或者正則表達式很難寫,或者你根本就不擅長寫正則表達式,那么可以考慮第二種約束方式:約束類。
  • 如上圖所示:定義約束類就是要實現IRouteConstraint接口的Match方法,這個方法就是用來判斷接口是否匹配的。使用這個約束類的方法也很簡單,就是在以前使用正則表達式的地方,換成用約束類的實例賦值,如上圖所示。
  • ?路由規則如下:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing;namespace MVCURLParaConstraint {public class RouteConfig{public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");// 2、使用約束類來約束參數值 routes.MapRoute(name: "Default1",url: "{controller}/{action}/{id}/{year}/{month}/{day}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },// 使用約束類的實例constraints: new { year = @"\d{4}", month =new MonthConstraint(), day = @"\d{2}" });// 1、使用正則表達式設置參數值的約束//routes.MapRoute(// name: "Default1",// url: "{controller}/{action}/{id}/{year}/{month}/{day}",// defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },// // year是4位整數 month和day是2位整數// constraints:new { year = @"\d{4}",month=@"\d{2}",day=@"\d{2}"}// );// 默認路由 routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}}/// <summary>/// 對月進行約束,實現IRouteConstraint接口/// 對年或者日進行約束同理/// </summary>public class MonthConstraint : IRouteConstraint{// 實現Match方法public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection){// values["month"]表示根據鍵名或者值// 長度為2,并且在1到12之間表示匹配通過返回true,否則不通過返回falseif (values["month"].ToString().Length==2 &&Convert.ToInt32(values["month"])>=1 &&Convert.ToInt32(values["month"]) <=12){return true;}else{return false;}}} }

    ?運行程序,在瀏覽器里面輸入:http://localhost:51244/Home/Index/2/2019/05/24?,效果如下:

    5、路由匹配順序

    如下圖所示:

    解釋說明:

  • 如圖所示,上面的URL跟哪個路由規則匹配呢?答案是匹配Default1這個路由,為什么會是這樣呢?其實如果只注冊單獨的一條路由,這兩條路由規則都是匹配這個URL的,這里有一個原則:如果有多條路由都和這個URL匹配,那么就是排在最前面的優先匹配,排在后面的就不在進行匹配。
  • 6、排除路由

    解釋說明:

  • 我們注意到RigisterRoutes方法中默認的第一句代碼是routes.IgnoreRoute方法,他的作用就是排除路由,比如上圖下面的URL不會在路由表中匹配的,而是直接被忽略掉!

  • 如果出了.axd以外的文件需要忽略,那么在IgnoreRoute方法里面添加需要忽略的路由即可。
  • 5、由URL到控制器

    先看下面的截圖:

    解釋說明:

  • 通過前面路由注冊的代碼會最終形成一個路由集合的數據,可以看作是一個路由表(RouteTable),那么請求是如何通過URL進入到相應的控制器及Action方法的呢?
  • 如上圖所示,請求到達ASP.NET MVC應用程序后,首先會經過一個名為“UrlRoutingModule”的HttpModule,HttpModule可以過濾每一個請求,UrlRoutingModule的作用就是根據請求的URL從路由表中查找和URL匹配的路由,然后從匹配的路由中得到一個名為MvcHandler的HttpHandler,之后就執行它的ProcessRequest方法,在ProcessRequest方法的內部找到Controller,并繼續往下執行。
  • 說到這里可能有疑問:某項路由數據是怎樣聯系到一個HttpHandler的呢?如下圖中的源碼所示:MapRoute方法實際上包含這樣一段代碼,在new的時候會初始化一個MvcRouteHandler對象,然后通過MvcRouteHandler的GetHttpHandler方法可以得到真正的處理程序MvcHandler。
  • 上面說的UrlRoutingModule在哪里呢?看下面截圖:

    6、從控制器中獲取URL值的方式

    從控制器中獲取URL中的值共有三種方式:

    解釋說明:

  • Request.QueryString只能獲取以?分隔的參數值!
  • RouteDate.Values[“id”]就是當前字典上的路由數據,通過訪問鍵名的方式得到鍵值,比如URL模式匹配的字符串是id,這里必須是id。

  • Action方法的參數和路由字典的參數是對應的,MVC框架在執行action之前會首先為這些參數賦值。

  • 6.1、Request.QueryString

    控制器代碼如下:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc;namespace MVCURlValue.Controllers {public class HomeController : Controller{/// <summary>/// Request.QueryString/// </summary>/// <returns></returns>public ActionResult Index(){if(Request.QueryString["bookid"]!=null){string value = Request.QueryString["bookid"];ViewData["msg"] = value;}return View();}public ActionResult About(){ViewBag.Message = "Your application description page.";return View();}public ActionResult Contact(){ViewBag.Message = "Your contact page.";return View();}} }

    ?

    視圖也代碼如下:

    @{ViewBag.Title = "Home Page"; }<div class="jumbotron"><h1>ASP.NET</h1><p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p><p><a href="https://asp.net" class="btn btn-primary btn-lg">Learn more &raquo;</a></p><p style="color:red;font-weight:bold;">@ViewData["msg"]</p> </div><div class="row"><div class="col-md-4"><h2>Getting started</h2><p>ASP.NET MVC gives you a powerful, patterns-based way to build dynamic websites thatenables a clean separation of concerns and gives you full control over markupfor enjoyable, agile development.</p><p><a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkId=301865">Learn more &raquo;</a></p></div><div class="col-md-4"><h2>Get more libraries</h2><p>NuGet is a free Visual Studio extension that makes it easy to add, remove, and update libraries and tools in Visual Studio projects.</p><p><a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkId=301866">Learn more &raquo;</a></p></div><div class="col-md-4"><h2>Web Hosting</h2><p>You can easily find a web hosting company that offers the right mix of features and price for your applications.</p><p><a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkId=301867">Learn more &raquo;</a></p></div> </div>

    程序運行效果:

    6.2、RouteData.Values

    控制器代碼如下:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc;namespace MVCURlValue.Controllers {public class HomeController : Controller{/// <summary>/// Request.QueryString/// </summary>/// <returns></returns>//public ActionResult Index()//{// if(Request.QueryString["bookid"]!=null)// {// string value = Request.QueryString["bookid"];// ViewData["msg"] = value;// }// return View();//}/// <summary>/// RouteData.Values/// </summary>/// <returns></returns>public ActionResult Index(){string value = $"controller={RouteData.Values["controller"]},action={RouteData.Values["action"]}";ViewData["msg"] = value;return View();}public ActionResult About(){ViewBag.Message = "Your application description page.";return View();}public ActionResult Contact(){ViewBag.Message = "Your contact page.";return View();}} }

    運行效果:

    這時會遇到一個問題,如果在URL里面還有其他參數呢?比如下面的情況

    ?

    這時候如果要獲取id的值就要修改代碼,那么有沒有其他簡便的方式呢?看下面代碼:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc;namespace MVCURlValue.Controllers {public class HomeController : Controller{/// <summary>/// Request.QueryString/// </summary>/// <returns></returns>//public ActionResult Index()//{// if(Request.QueryString["bookid"]!=null)// {// string value = Request.QueryString["bookid"];// ViewData["msg"] = value;// }// return View();//}/// <summary>/// RouteData.Values/// </summary>/// <returns></returns>public ActionResult Index(){// 方式一//string value = $"controller={RouteData.Values["controller"]},action={RouteData.Values["action"]}";// 方式二string value = "";foreach(var item in RouteData.Values){value += $"{item.Key}={item.Value} ";}ViewData["msg"] = value;return View();}public ActionResult About(){ViewBag.Message = "Your application description page.";return View();}public ActionResult Contact(){ViewBag.Message = "Your contact page.";return View();}} }

    ?運行效果:

    因為RouteData.Values是一個字典集合,所以可以遍歷RouteData.Values,這樣無論URL里面有多少參數,都可以獲取到對應的value值。

    6.3、action參數

    控制器代碼:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc;namespace MVCURlValue.Controllers {public class HomeController : Controller{/// <summary>/// Request.QueryString/// </summary>/// <returns></returns>//public ActionResult Index()//{// if(Request.QueryString["bookid"]!=null)// {// string value = Request.QueryString["bookid"];// ViewData["msg"] = value;// }// return View();//}/// <summary>/// RouteData.Values/// </summary>/// <returns></returns>//public ActionResult Index()//{// // 方式一// //string value = $"controller={RouteData.Values["controller"]},action={RouteData.Values["action"]}";// // 方式二// string value = "";// foreach(var item in RouteData.Values)// {// value += $"{item.Key}={item.Value} ";// }// ViewData["msg"] = value;// return View();//}/// <summary>/// action參數/// 方法參數名稱必須和URL里面參數名稱保持一致/// </summary>/// <returns></returns>public ActionResult Index(string controller,string action){string value = $"controller={controller},action={action}";ViewData["msg"] = value;return View();}public ActionResult About(){ViewBag.Message = "Your application description page.";return View();}public ActionResult Contact(){ViewBag.Message = "Your contact page.";return View();}} }

    運行效果:

    7、由路由到URL

    解釋說明:

  • 1.由路由生成URL其實就是簡單的兩句代碼,第一步就是使用RouteCollection對象的GetVirtualPath方法,通過該方法可以返回一個VirtualPahData對象,該類型表示有關路由和虛擬路徑的信息,包含了兩個重載的方法,區別是第二個方法可以指定路由項的名稱,就是添加路由時,設置的路由鍵名,參數Values表達生成URL時設置的參數值,是一個字典類型。

  • 1.得到VirtualPahData實例后,就可以通過他的VirtualPath屬性值得到URL地址,它是一個字符串類型,從路由的這個功能可以看出,他是有雙向功能的,不同于URL重寫!

  • 看下面的案例:

    修改RouteConfig代碼如下:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing;namespace MVCRouteToUrl {public class RouteConfig{public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute(name: "Default2",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", id = UrlParameter.Optional });// 默認路由匹配規則 routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}} }

    控制器代碼如下:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing;namespace MVCRouteToUrl.Controllers {public class HomeController : Controller{public ActionResult Index(){// 1.不使用路由名稱的方式生成URLVirtualPathData vp= RouteTable.Routes.GetVirtualPath(null, new RouteValueDictionary(new { controller = "Home", action = "Index2", id = 4 }));string url = vp.VirtualPath;ViewData["msg"] = url;return View();}public ActionResult About(){ViewBag.Message = "Your application description page.";return View();}public ActionResult Contact(){ViewBag.Message = "Your contact page.";return View();}} }

    ?界面運行效果:

    在看下面一種方式:

    控制器代碼:

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing;namespace MVCRouteToUrl.Controllers {public class HomeController : Controller{public ActionResult Index(){// 1.不使用路由名稱的方式生成URL//VirtualPathData vp= RouteTable.Routes.GetVirtualPath(null, new RouteValueDictionary(new { controller = "Home", action = "Index2", id = 4 }));//string url = vp.VirtualPath;//ViewData["msg"] = url;// 2.根據路由名稱生成URL// 因為controller和id有默認值,所以這里只指定action的值VirtualPathData vp = RouteTable.Routes.GetVirtualPath(null, "Default2", new RouteValueDictionary(new { action = "Index5" }));string url = vp.VirtualPath;ViewData["msg"] = url;return View();}public ActionResult About(){ViewBag.Message = "Your application description page.";return View();}public ActionResult Contact(){ViewBag.Message = "Your contact page.";return View();}} }

    ?運行效果:

    ?

    轉載于:https://www.cnblogs.com/dotnet261010/p/10909527.html

    總結

    以上是生活随笔為你收集整理的ASP.NET MVC教程五:ASP.NET MVC中的路由的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。