ASP.NET MVC路由(五)
前言
前面的篇幅解说了MVC中的路由系统,仅仅是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描写叙述、思维导图没法让您看到路由的实际运用,特此篇幅来说明一下简单的演示样例。
路由的命名空间的定义
对于路由其中url规则、默认值、url參数约束这些的定义网上都有,本篇讲一下路由中命名空间的定义。
大家都知道路由的作用,让请求匹配到合理的控制器名称,而且交由控制器工厂来生成控制器来运行请求。然而在项目中难免会命名出同样名称的控制器,我们来模拟一下会发现什么情况。
环境配置
在MVC项目中Controllers文件上右击->加入->控制器,命名为HomeController,而且选择空模板。然后就不用管这个控制器了,什么都不要做了,在此类型所在的命名空间之外加入下面代码:
1 namespace AAAAA 2 { 3 public class HomeController : Controller 4 { 5 public ActionResult Index() 6 { 7 this.ViewBag.Name = this.GetType().FullName; 8 return View(); 9 } 10 } 11 } 12 namespace BBBBB 13 { 14 public class HomeController : Controller 15 { 16 public ActionResult Index() 17 { 18 this.ViewBag.Name = this.GetType().FullName; 19 return View(); 20 } 21 } 22 }
这个时候就是模拟的项目中因为时间的推移引用越来越多的程序集以及各种项目,所可能带来的反复命名,此时Global.asax文件里的默认路由定义:
1 routes.MapRoute( 2 "Default", // 路由名称 3 "{controller}/{action}/{id}", // 带有參数的 URL 4 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參数默认值
我们也不用管,直接開始调试,则会看到下面这种错误,如图:
这样的情况给谁都不愿意发生,假设我们此时仅仅须要AAAAA命名空间下的Home控制器怎么办?好办,用路由来配置:
1 routes.MapRoute( 2 "", 3 "{controller}/{action}", 4 new { controller = "Home", action = "Index" }, 5 null, 6 new string[] { "AAAAA" } 7 );
仅仅须要在MapRoute方法中将所需的命名空间定义为数组传入就可以,此时我们右键AAAAA命名空间下的HomeController类型中的Index()方法,点击加入视图->加入,完毕后在项目的Views目录下的Home目录下有个Index.cshtml文件就是加入的视图文件了,打开而且加入例如以下代码:
1 <h2>@ViewBag.Name</h2>
此时我们再运行MVC项目后,如图:
此时有的朋友可能会问,假设想让系统如今AAAAA命名空间下搜寻假设没有则在BBBBB下搜寻控制器,然后让路由这样定义:
1 routes.MapRoute( 2 "", 3 "{controller}/{action}", 4 new { controller = "Home", action = "Index" }, 5 null, 6 new string[] { "AAAAA","BBBBB" } 7 );
告诉朋友们这样是不行的,假设AAAAA下没有Home控制器还好,假设有系统还是会继续搜寻BBBBB命名空间下的全部类型,关于这里的详细实现将在后面的默认控制器工厂篇幅中讲到。
假设想仅仅在指定的命名空间下搜索的必须是这样定义:
1 Route route= routes.MapRoute( 2 "", 3 "{controller}/{action}", 4 new { controller = "Home", action = "Index" }, 5 null, 6 new string[] { "AAAAA" } 7 ); 8 route.DataTokens["UseNamespaceFallback"] = false;
这里的MapRoute()方法会返回一个Route对象,前面我们也说过Route对象的,仅仅只是在注冊路由的时候我们全然没有必要获取Route对象的引用,在这里我们须要获取到它,而且要把DataTokens属性集中的UseNamespaceFallback键所相应的值设置为false。这个值将会被传递到控制器工厂中,兴许篇幅会讲到。
这种结果是假设没有搜索到指定的控制器系统也会停止搜索。