ASP.NET MVC教程五:ASP.NET MVC中的路由
一、概述
在ASP.NET MVC架構(gòu)中,控制器在3大核心構(gòu)件中處于中心地位,通過控制器支配模型和視圖,然而從瀏覽器發(fā)出的請(qǐng)求到控制器還需要路由的協(xié)助,路由將特定的請(qǐng)求和控制器的動(dòng)作對(duì)應(yīng)起來(lái)。
在ASP.NET MVC程序中,路由主要有兩方面的職責(zé):
二、路由原理
1、注冊(cè)路由
先看Global.asax中的代碼:
網(wǎng)站啟動(dòng)的時(shí)候執(zhí)行Application_Start方法,通過RouteConfig.RegisterRoutes(RouteTable.Routes)這段代碼進(jìn)行路由的注冊(cè),在RegisterRoutes上面F12轉(zhuǎn)到定義,可以查看該方法,其實(shí)就是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滿足這個(gè)正則規(guī)則,就不使用路由// .axd 是因?yàn)閕is6給沒有后綴的請(qǐng)求加個(gè)asd,然后支持MVC的請(qǐng)求routes.IgnoreRoute("{resource}.axd/{*pathInfo}");// 默認(rèn)路由規(guī)則// 里面使用的是命名參數(shù),順序可以改變 routes.MapRoute(// 路由名稱 RouteCollection是個(gè)字典 每個(gè)路由都要有自己的名稱,相同名稱的路由會(huì)被覆蓋name: "Default",// url的正則規(guī)則,去掉域名和端口后的地址進(jìn)行匹配url: "{controller}/{action}/{id}",// 默認(rèn)值defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}} }注冊(cè)路由其實(shí)就是把路由規(guī)則添加到RouteCollection路由集合中。
解釋說明:
啟動(dòng)程序,這時(shí)URL地址是:http://localhost:49730
其實(shí)該地址相當(dāng)于在瀏覽器里面輸入:http://localhost:49730/Home/Index,這時(shí)因?yàn)樵诼酚梢?guī)則里面設(shè)置了默認(rèn)值,如果沒有控制器和action方法,則默認(rèn)是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滿足這個(gè)正則規(guī)則,就不使用路由// .axd 是因?yàn)閕is6給沒有后綴的請(qǐng)求加個(gè)asd,然后支持MVC的請(qǐng)求routes.IgnoreRoute("{resource}.axd/{*pathInfo}");// 默認(rèn)路由規(guī)則// 里面使用的是命名參數(shù),順序可以改變 routes.MapRoute(// 路由名稱 RouteCollection是個(gè)字典 每個(gè)路由都要有自己的名稱,相同名稱的路由會(huì)被覆蓋name: "Default",// url的正則規(guī)則,去掉域名和端口后的地址進(jìn)行匹配url: "{controller1}/{action1}/{id}",// 默認(rèn)值defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}} }?然后運(yùn)行程序查看結(jié)果:
這時(shí)程序運(yùn)行出錯(cuò),所以說controller和action千萬(wàn)不能寫錯(cuò)。把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滿足這個(gè)正則規(guī)則,就不使用路由// .axd 是因?yàn)閕is6給沒有后綴的請(qǐng)求加個(gè)asd,然后支持MVC的請(qǐng)求routes.IgnoreRoute("{resource}.axd/{*pathInfo}");// 默認(rèn)路由規(guī)則// 里面使用的是命名參數(shù),順序可以改變 routes.MapRoute(// 路由名稱 RouteCollection是個(gè)字典 每個(gè)路由都要有自己的名稱,相同名稱的路由會(huì)被覆蓋name: "Default",// url的正則規(guī)則,去掉域名和端口后的地址進(jìn)行匹配url: "{action}/{controller}/{id}",// 默認(rèn)值defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}} }?在運(yùn)行程序查看結(jié)果:
這說明:controller和action的位置是可以顛倒的。這時(shí)如果想輸入完整的URL地址就行訪問就應(yīng)該輸入:http://localhost:49730/Index/Home。
2、路由匹配
2.1、匹配方式一
看下面的截圖:
解釋說明:
?看下面的示例:
首先修改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 = "";// 遍歷獲取參數(shù)值foreach(KeyValuePair<string,object> keyValue in RouteData.Values){paras += string.Format($"{keyValue.Key}={keyValue.Value} ");}// 通過ViewData向頁(yè)面?zhèn)髦?/span>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();}} }?修改對(duì)應(yīng)的視圖,在界面展示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 »</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 »</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 »</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 »</a></p></div> </div>?1、使用{parameter}做模糊匹配其實(shí)就是默認(rèn)路由規(guī)則:
routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );?運(yùn)行程序查看結(jié)果:
2、使用字面量做精確匹配
路由規(guī)則如下代碼所示:
routes.MapRoute(name: "const",url: "admin/{controller}/{action}" );?運(yùn)行程序,在瀏覽器里面輸入:http://localhost:64957/admin/home/index,運(yùn)行結(jié)果如下:
3、不允許連續(xù)的URL參數(shù)
路由規(guī)則如下:
routes.MapRoute(name: "blx",// 錯(cuò)誤的URL// url: "{language}{country}/{controller}/{action}"url: "{language}-{country}/{controller}/{action}" );運(yùn)行程序,URL里面輸入:http://localhost:64957/chinese-china/home/index,運(yùn)行結(jié)果如下:
2.2、匹配方式二
看下面截圖:
解釋說明:
看下面的路由規(guī)則:
routes.MapRoute(name: "RouteRule",url: "{controller}/{action}/{query-name}/{*plus}" );?運(yùn)行程序,在URL里面輸入:http://localhost:64957/home/index/123/wqer_1234,運(yùn)行結(jié)果如下:
2.3、匹配方式三
看下面截圖:
解釋說明:
路由規(guī)則1:
routes.MapRoute(name: "tlppone",url: "{controller}/{action}/{filename}.{ext}" );?運(yùn)行程序,在URL里面輸入:http://localhost:64957/home/index/2342.234.234.aspx,運(yùn)行結(jié)果如下:
路由規(guī)則2:
routes.MapRoute(name: "tlpptwo",url: "{controller}/{action}/{foo}xyz{bar}" );?運(yùn)行程序,在URL里面輸入:http://localhost:64957/home/index/xyzxyzxyzwer23,運(yùn)行結(jié)果如下:
完整路由規(guī)則代碼如下:
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}");// 不允許連續(xù)的URL參數(shù)// http://localhost:64957/chinese-china/home/index routes.MapRoute(name: "blx",// 錯(cuò)誤的URL// url: "{language}{country}/{controller}/{action}"url: "{language}-{country}/{controller}/{action}");// 使用*號(hào)匹配URL剩余部分// http://localhost:64957/home/index/2342.234.234.aspx 與第一個(gè)和第二個(gè)路由規(guī)則都匹配,顯示第一個(gè),說明路由匹配的順序是從上往下// 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參數(shù)默認(rèn)值
3.1、參數(shù)默認(rèn)值一
看下面的截圖:
解釋說明:
路由規(guī)則代碼如下:
// 參數(shù)默認(rèn)值一 routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );3.2、參數(shù)默認(rèn)值二
看下面截圖:
解釋說明:
路由規(guī)則如下:
// 參數(shù)默認(rèn)值二:默認(rèn)值不提供的必須通過URL提供 routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { action = "Index", id = UrlParameter.Optional });?這時(shí)直接運(yùn)行程序,因?yàn)闆]有提供controller,所以程序會(huì)報(bào)錯(cuò):
然后在URL里面輸入:http://localhost:55650/Home,就可以正常訪問了:
3.4、參數(shù)默認(rèn)值三
解釋說明:
路由規(guī)則如下:
// 參數(shù)默認(rèn)值三:只提供中間參數(shù)的默認(rèn)值是不起作用的 routes.MapRoute(name: "Default2",url: "{controller}/{action}/{id}",defaults: new { action = "Index" } );?
這時(shí)候需要在瀏覽器里面輸入完整的URL才能訪問。
3.4、參數(shù)默認(rèn)值四
看下面截圖:
解釋說明:
規(guī)律:使用/把URL劃分成若干個(gè)部分,如果各個(gè)部分包含了URL參數(shù)和字面量,那么給這些URL參數(shù)提供默認(rèn)值是不起作用的。如圖所示,給參數(shù)2和參數(shù)3是不起作用的!
路由規(guī)則如下:
// 參數(shù)默認(rèn)值四:只提供中間參數(shù)的默認(rèn)值是不起作用的 routes.MapRoute(name: "Default2",url: "{controller}-{action}",defaults: new { action = "Index" });運(yùn)行程序,如果瀏覽器里面只輸入http://localhost:55650/home-?是報(bào)錯(cuò)的:
這時(shí)需要輸入完整的URL地址:http://localhost:55650/home-index
4、參數(shù)值約束
?假如我們想對(duì)URL后面的數(shù)字進(jìn)行限制,比如四位數(shù)字或者兩位數(shù)字,如下圖所示,該如何限制呢?
1、使用正則表達(dá)式
如下圖所示:
解釋說明:
路由規(guī)則如下:
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、使用正則表達(dá)式設(shè)置參數(shù)值的約束 routes.MapRoute(name: "Default1",url: "{controller}/{action}/{id}/{year}/{month}/{day}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },// year是4位整數(shù) month和day是2位整數(shù)constraints:new { year = @"\d{4}",month=@"\d{2}",day=@"\d{2}"});// 默認(rèn)路由 routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}} }?運(yùn)行程序,在瀏覽器里面輸入:http://localhost:51244/Home/Index/1/2019/05/24,效果如下:
因?yàn)樵O(shè)置了約束month是2位整數(shù),這時(shí)將month改為1位整數(shù),然后輸入:http://localhost:51244/Home/Index/1/2019/5/24,效果如下:
這時(shí)程序就報(bào)錯(cuò)了,說明設(shè)置的正則約束起作用了。
2、使用約束類
如下圖所示:
解釋說明:
?路由規(guī)則如下:
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、使用約束類來(lái)約束參數(shù)值 routes.MapRoute(name: "Default1",url: "{controller}/{action}/{id}/{year}/{month}/{day}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },// 使用約束類的實(shí)例constraints: new { year = @"\d{4}", month =new MonthConstraint(), day = @"\d{2}" });// 1、使用正則表達(dá)式設(shè)置參數(shù)值的約束//routes.MapRoute(// name: "Default1",// url: "{controller}/{action}/{id}/{year}/{month}/{day}",// defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },// // year是4位整數(shù) month和day是2位整數(shù)// constraints:new { year = @"\d{4}",month=@"\d{2}",day=@"\d{2}"}// );// 默認(rèn)路由 routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}}/// <summary>/// 對(duì)月進(jìn)行約束,實(shí)現(xiàn)IRouteConstraint接口/// 對(duì)年或者日進(jìn)行約束同理/// </summary>public class MonthConstraint : IRouteConstraint{// 實(shí)現(xiàn)Match方法public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection){// values["month"]表示根據(jù)鍵名或者值// 長(zhǎng)度為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;}}} }?運(yùn)行程序,在瀏覽器里面輸入:http://localhost:51244/Home/Index/2/2019/05/24?,效果如下:
5、路由匹配順序
如下圖所示:
解釋說明:
6、排除路由
解釋說明:
我們注意到RigisterRoutes方法中默認(rèn)的第一句代碼是routes.IgnoreRoute方法,他的作用就是排除路由,比如上圖下面的URL不會(huì)在路由表中匹配的,而是直接被忽略掉!
5、由URL到控制器
先看下面的截圖:
解釋說明:
上面說的UrlRoutingModule在哪里呢?看下面截圖:
6、從控制器中獲取URL值的方式
從控制器中獲取URL中的值共有三種方式:
解釋說明:
RouteDate.Values[“id”]就是當(dāng)前字典上的路由數(shù)據(jù),通過訪問鍵名的方式得到鍵值,比如URL模式匹配的字符串是id,這里必須是id。
Action方法的參數(shù)和路由字典的參數(shù)是對(duì)應(yīng)的,MVC框架在執(zhí)行action之前會(huì)首先為這些參數(shù)賦值。
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 »</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 »</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 »</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 »</a></p></div> </div>程序運(yùn)行效果:
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();}} }運(yùn)行效果:
這時(shí)會(huì)遇到一個(gè)問題,如果在URL里面還有其他參數(shù)呢?比如下面的情況
?
這時(shí)候如果要獲取id的值就要修改代碼,那么有沒有其他簡(jiǎn)便的方式呢?看下面代碼:
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();}} }?運(yùn)行效果:
因?yàn)镽outeData.Values是一個(gè)字典集合,所以可以遍歷RouteData.Values,這樣無(wú)論URL里面有多少參數(shù),都可以獲取到對(duì)應(yīng)的value值。
6.3、action參數(shù)
控制器代碼:
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參數(shù)/// 方法參數(shù)名稱必須和URL里面參數(shù)名稱保持一致/// </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();}} }運(yùn)行效果:
7、由路由到URL
解釋說明:
1.由路由生成URL其實(shí)就是簡(jiǎn)單的兩句代碼,第一步就是使用RouteCollection對(duì)象的GetVirtualPath方法,通過該方法可以返回一個(gè)VirtualPahData對(duì)象,該類型表示有關(guān)路由和虛擬路徑的信息,包含了兩個(gè)重載的方法,區(qū)別是第二個(gè)方法可以指定路由項(xiàng)的名稱,就是添加路由時(shí),設(shè)置的路由鍵名,參數(shù)Values表達(dá)生成URL時(shí)設(shè)置的參數(shù)值,是一個(gè)字典類型。
1.得到VirtualPahData實(shí)例后,就可以通過他的VirtualPath屬性值得到URL地址,它是一個(gè)字符串類型,從路由的這個(gè)功能可以看出,他是有雙向功能的,不同于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 });// 默認(rèn)路由匹配規(guī)則 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();}} }?界面運(yùn)行效果:
在看下面一種方式:
控制器代碼:
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.根據(jù)路由名稱生成URL// 因?yàn)閏ontroller和id有默認(rèn)值,所以這里只指定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();}} }?運(yùn)行效果:
?
轉(zhuǎn)載于:https://www.cnblogs.com/dotnet261010/p/10909527.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET MVC教程五:ASP.NET MVC中的路由的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: day33-进程池和线程池
- 下一篇: 专访微软Greg Yang,构建神经网络