明白默许路由表
当你建立一个新的ASP.NET MVC应用递次时,应用递次已被设置为运用ASP.NET路由.ASP.NET路由在两个处所设置。
第一点,在你的应用递次的Web设置文件(Web.config文件文件)中启用ASP.NET路由在设置文件中有四个节点与路由有关:sytem.web.httpModules节,system.web.httpHandlers节,system.webserver.modules节,以及system.webserver.handlers节。特别要警惕不要删除了这些节点,因为没有它们路由将不能事情。
第二点,也是更为主要的一点,在应用递次的Global.asax中文件中建立了一个路由表.Global.asax文件是一个特别的文件,它包括了作用于ASP.NET应用递次生命周期事宜的事宜处置惩罚递次。路由表在应用递次最先事宜时期建立。
代码清单1中的文件包括了一个ASP.NET MVC应用递次的默许Global.asax文件。
代码清单1 - Global.asax.cs
运用体系; 运用 System.Collections.Generic; 运用 System.Linq; 运用 System.Web; 运用 System.Web.Mvc; 运用 System.Web.Routing; 定名空间 MvcApplication1 { //注重:有关启用IIS6或IIS7典范形式的申明, 请接见http://go.microsoft.com/?LinkId=9394801 public class MvcApplication:System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection路由) { routes.IgnoreRoute( “{resource} .axd / {* pathInfo}”); 线路。 MapRoute( “Default”, // Route name “{controller} / {action} / {id}”, //具有参数 的URL new {controller = “Home”,action =“Index”,id =“” } //参数默许值 ); } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); } } } //具有参数的URL new {controller = “Home”,action =“Index”,id =“” } //参数defaults); } protected void Application_Start(){RegisterRoutes(RouteTable.Routes); }}} //具有参数的URL new {controller = “Home”,action =“Index”,id =“” } //参数defaults); } protected void Application_Start(){RegisterRoutes(RouteTable.Routes); }}} } protected void Application_Start(){RegisterRoutes(RouteTable.Routes); }}} } protected void Application_Start(){RegisterRoutes(RouteTable.Routes); }}}
当一个MVC应用递次初次运行时,会挪用的Application_Start()要领。这个要领随后挪用了的RegisterRoutes()要领.RegisterRoutes()要领建立了路由表。
默许的路由表包括了一个路由(名叫默许).DEFAULT路由将URL的第一部份映照到控制器名,URL的第二部份映照到控制器行为,第三个部份映照到一个叫做ID的参数。
假定你在浏览器的地点栏输入了下面的网址:
/首页/索引/ 3
默许的路由将这个URL映照为下面的参数:
控制器=首页
Action = Index
id = 3
当你要求URL /首页/索引/ 3时,将会实行下面的代码:
HomeController.Index(3)
默许路由包括了一切三个参数的默许值。假如你不供应控制器,那末控制器参数默许值为首页。假如你不供应行为,行为参数默许为值目的。末了,假如你不供应ID,ID参数默许为空字符串。
让我们看看几个例子,默许路由是怎样将URL映照到控制器行为的想象你在浏览器地点栏输入了下面的网址:
/家
因为缺省路由参数的默许值,输入这个网址将会挪用代码清单2中的HomeController的类的指数()要领。
代码清单2 - HomeController.cs
运用 System.Web.Mvc; 定名空间 MvcApplication1.Controllers { [HandleError] public class HomeController:Controller { public ActionResult Index(string id) { return View(); } } }
在代码清单2中,HomeController类包括了一个叫做Index()的要领,它接收一个叫做Id的参数.URL / Home将会致使挪用Index()要领,并使空字符串作为Id参数的值。
出于MVC框架挪用控制器行为的体式格局,URL / Home也婚配代码清单3中HomeController类的索引()要领。
代码清单3 - HomeController.cs(不含参数的索引行为)
运用 System.Web.Mvc; 定名空间 MvcApplication1.Controllers { [HandleError] public class HomeController:Controller { public ActionResult Index() { return View(); } } }
代码清单3中的Index()要领不接收任何的参数.URL / Home将会致使挪用这个Index()要领.URL / Home / Index / 3也会挪用这个要领(Id被疏忽)。
URL / Home也会婚配代码清单4中HomeController类的索引()要领。
代码清单4 - HomeController.cs(运用可空参数的索引行为)
运用 System.Web.Mvc; 定名空间 MvcApplication1.Controllers { [HandleError] public class HomeController:Controller { public ActionResult Index(int?id) { return View(); } } }
在代码清单4中,索引()要领具有一个整数参数。因为这个参数是一个可空参数(可以具有空值),因而可以挪用指数()而不会激发毛病。
末了,运用URL / Home挪用代码清单5中的Index()要领将会激发一个异常,因为Id参数并不是一个可空参数。假如你试图挪用Index()要领,那末你将会取得一个图1中所示的毛病。
代码清单5 - HomeController.cs(含有Id参数的索引行为)
运用 System.Web.Mvc; 定名空间 MvcApplication1.Controllers { [HandleError] public class HomeController:Controller { public ActionResult Index(int id) { return View(); } } }
图01:挪用一个希冀参数值的控制器行为
另一方面,URL / Home / Index / 3可以与代码清单5中的索引控制器行为很好地事情./Home/Index/3要求将会激发挪用含有一个Id的索引()要领,且该Id值为3。
这篇教程的目的是为你供应一个ASP.NET路由的简短引见。我们细致查看了默许的路由表,它在你建立新的ASP.NET MVC应用递次时取得。你进修了默许的路由表怎样将URL映照到控制器行为。
2.建立自定义路由
在这篇教程中,你会进修到如作甚ASP.NET MVC应用递次增加自定义路由。你会进修怎样将Global.asax文件中的默许路由表修改成自定义路由。
关于简朴的ASP.NET MVC应用递次,默许的路由表已可以很好的完成事情了。然则,你可以发明会存在特定的路由需求在这类情况下,你可以建立一个自定义路由。
想象一下,举个例子,你正在建立一个博客应用递次你能够想要像如许处置惩罚行将到来的要求:
/存档/ 2009年12月25日
当用户输入这一要求,你想要返回对应于日期2009年12月25日的博客条目。为了处置惩罚这类范例的要求,你须要建立一个自定义路由。
代码清单1中的Global.asax包括了一个新的自定义路由,定名为了博客,它处置惩罚了相似/存档/条目日期如许的要求。
代码清单1 - Global.asax(含有自定义路由)
运用 System.Web.Mvc; 运用 System.Web.Routing; 定名空间 MvcApplication1 { public class MvcApplication:System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute(“{resource} .axd / {* pathInfo}”); routes.MapRoute( “Blog”, //路由称号 “Archive / {entryDate}”, //具有参数 的URL new {controller = “Archive”,action =“ } //参数defaults ); routes.MapRoute( “Default”,//路由称号 “{controller} / {action} / {id}”,//具有参数 的URL new {controller = “Home”,action =“Index”,id =“” } //参数defaults ); } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); } } } } //参数defaults); routes.MapRoute(“Default”,//路由称号“{controller} / {action} / {id}”,//具有参数的URL new {controller = “Home”,action =“Index”,id =“” } //参数defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } } ,//路由称号“{controller} / {action} / {id}”,//具有参数的URL new {controller = “Home”,action =“Index”,id =“” } //参数defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } } , //路由称号“{controller} / {action} / {id}”, //具有参数的URL new {controller = “Home”,action =“Index”,id =“” } //参数defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } } //具有参数的URL new {controller = “Home”,action =“Index”,id =“” } //参数defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } } //具有参数的URL new {controller = “Home”,action =“Index”,id =“” } //参数defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } }
增加到路由表中的路由递次异常主要。我们的新自定义博客路由在现有的默许路由前面。假如你将这个递次倒置过来,那末默许路由将老是被挪用,而不是自定义路由。
自定义博客路由婚配任何故/存档/作为最先的要求因而,它婚配一切下面的网址:
/存档/ 2009年12月25日
/存档/ 2004年10月6日
/存档/苹果
自定义路由将行将到来的要求映照到名为存档的控制器,而且挪用了条目()行为。当挪用项()要领时,条目日期作为entryDate参数进行了通报。
代码清单2 - ArchiveController.cs
运用体系; 运用 System.Web.Mvc; 定名空间 MvcApplication1.Controllers { public class ArchiveController:Controller { public string Entry(DateTime entryDate) { return “您从” + entryDate.ToString())要求了条目。 } } }
注重到代码清单2中的条目()要领接收一个日期时候范例的参数.MVC框架异常的智慧,足以自动地将URL中的条目日期转换为日期时候值。假如URL中的条目日期参数不能转换为日期时候,将会激发毛病(如图1)。
图1 - 转换参数时的毛病
这篇教程的目的是演示怎样建立自定义路由。你进修了怎样在Global.asax中文件的路由表中增加自定义路由,该路由代表着博客条目。我们议论了怎样将对博客条目的要求映照到名为ArchiveController的控制器,和名为项()的控制器行为上。
3.建立路由束缚
你可以运用路由束缚来限定婚配特定路由的浏览器要求。可以运用正则表达式来指定一个路由束缚。
举个例子,假定你已在Global.asax中文件中定义了一个路由。
代码清单1 - Global.asax.cs
routes.MapRoute( “Product”, “Product / {productId}”, new {controller =“Product”,action =“Details”} );
代码清单1包括一个叫做产物的路由。你可以运用产物路由将浏览器要求映照到代码清单2中的ProductController的。
代码清单2 - Controllers \ ProductController.cs
运用 System.Web.Mvc; 定名空间 MvcApplication1.Controllers { public class ProductController:Controller { public ActionResult Details(int productId) { return View(); } } }
注重到产物控制器宣布的细致信息()行为接收一个叫做的productId的参数。这个参数是一个整数参数。
定义在代码清单1中的路由将会婚配下面的恣意网址:
/产物/ 23 /产物/ 7 不幸的是,路由也会婚配下面的网址: /产物/嗒嗒 /产物/苹果
因为细致()行为希冀的是一个整数值,提议一个含有非整数值的要求将会致使毛病。举个例子,假如你在浏览器中输入/产物/苹果网址,那末你将会获得图1所示的毛病页。
图1:毛病页
你现实想做的是只婚配包括适宜整数productId参数的URL。当定义路由来限定与路由相婚配的网址时,你可以运用束缚。代码3中的修改后的产物路由包括了一个正则表达式,它限定了只婚配数字。
代码清单3 - Global.asax.cs
routes.MapRoute( “Product”, “Product / {productId}”, new {controller =“Product”,action =“Details”}, new {productId = @“\ d +”} )
正则表达式\ D +婚配一个或多个整数这个限定使得产物路由婚配了下面的网址:
/产物/ 3 /产物/ 8999 然则不婚配下面的网址: /产物/苹果 /产物
这些浏览器要求将自在别的的路由处置惩罚,或许,假如没有婚配的路由,将会返回一个“资本找不到”毛病。
建立一个自定义路由束缚
这篇教程的目的是演示怎样建立一个自定义路由束缚。自定义路由束缚许可你阻挠某个途径被婚配,除非满足一些自定义的前提。
在这篇教程中,我们建立了一个当地主机路由束缚.Localhost路由束缚只婚配当地计算机发出的要求。经由过程互联网发出的长途要求不会被婚配。
。你可以经由过程完成IRouteConstraint接口来完成一个自定义路由这是一个极为简朴的接口,它只形貌了一个要领:
bool Match( HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary值, RouteDirection routeDirection )
这个要领返回一个布尔值。假如返回了假,与束缚相干联的路由将不会婚配浏览器要求。
当地主机束缚包括在了代码清单1中。
代码清单1 - LocalhostConstraint.cs
运用 System.Web; 运用 System.Web.Routing; 定名空间 MvcApplication1.Constraints { public class LocalhostConstraint:IRouteConstraint { public bool Match ( HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection ) { return httpContext.Request.IsLocal; } } }
代码清单1中的束缚利用了HttpRequest的类宣布的IsLocal属性。当发出要求的IP地点是127.0.0.1或许与服务器的IP地点雷同时,这个属性返回真。
你在定义于Global.asax中的路由中运用了自定义束缚。代码清单2中的Global.asax中文件运用了当地主机束缚来阻挠任何人要求治理员页面,除非他们从当地服务器发出要求。举个例子,当要求来自长途服务器时,关于/治理/ DeleteAll的要求将会失利。
代码清单2 - Global.asax
运用体系; 运用 System.Collections.Generic; 运用 System.Linq; 运用 System.Web; 运用 System.Web.Mvc; 运用 System.Web.Routing; 运用 MvcApplication1.Constraints; 定名空间 MvcApplication1 { public class MvcApplication:System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes){ routes.IgnoreRoute( “{resource} .axd / {* pathInfo}”); routes.MapRoute( “Admin”, “Admin / {action}”, isLocal = new LocalhostConstraint()} ); //routes.MapRoute( // “默许”,//线路称号 // “{控制器} / {行为} /(编号)”,// URL与参数 // 新 {控制器= “主页”,行为=“索引“,id =”“ } //参数defaults //); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } }
当地主机束缚运用在了治理路由的定义中这个路由不会被长途浏览器要求所婚配然则,应当意想到定义在Global.asax中中的其他路由能够会婚配雷同的要求明白这一点很主要。:束缚阻挠了特定路由婚配某一要求,而不是一切定义在Global.asax中文件中的路由。
注重到默许路由在代码清单2中的Glabal.asax文件中被解释掉了。假如你包括默许路由,那末默许路由将会婚配对治理控制器的要求。在这类情况下,长途用户依然可以挪用治理控制器的行为,纵然他们的要求不婚配治理路由。
【相干引荐】
1. 什么是ASP.NET MVC ?总结ASP.NET MVC
2. 细致引见ASP.NET MVC--控制器(controller)
3. 细致引见ASP.NET MVC--视图
4. 深切相识ASP.NET MVC与WebForm的区分
5. 经由过程asp.net mvc开辟微信自定义菜单编辑东西的代码示例
以上就是细致引见ASP.NET MVC--路由的细致内容,更多请关注ki4网别的相干文章!