ASP.NET MVC学习之路由篇(2)
复制代码
1 public class routeconfig
2 {
3 public static void registerroutes(routecollection routes)
4 {
5 routes.routeexistingfiles = true;
6
7 routes.maproute(
8 name: "default2",
9 url: "test.html",
10 defaults: new { controller = "home", action = "list" }
11 );
12 }
13 }
复制代码
这个时候我们再重新刷新,那么我们就可以看到控制器返回的结果了,这样我们就解决了物理路径和路由之间的冲突问题了。
8.绕过路由
如果我们有一些url路径不希望通过路由系统,那么我们就可以利用这节知识。
下面是routeconfig.cs的内容:
复制代码
1 public class routeconfig
2 {
3 public static void registerroutes(routecollection routes)
4 {
5 routes.ignoreroute("webresources.axd{*pathinfo}");
6
7 routes.maproute(
8 name: "default2",
9 url: "test.html",
10 defaults: new { controller = "home", action = "list" }
11 );
12 }
13 }
复制代码
9.自定义路由系统
如果上面的技术还无法解决你的问题,那么我们下面将会介绍如何自定义路由系统。自定义路由系统只需要继承routebase并实现两个方法,如下:
(1):getroutedata
(2):getvirtualpath
下面是我写的一个简单示例,用来判断访问者是否是移动设备,如果是移动设备则路由到前缀为m的控制器处理请求,否则返回null交由默认的路由
处理,下面为我的:
复制代码
1 public class customroutebase : routebase
2 {
3 private list<string> useragent;
4
5 public customroutebase(params string[] useragents)
6 {
7 useragent = useragents.tolist();
8 }
9
10 public override routedata getroutedata(httpcontextbase httpcontext)
11 {
12 routedata rd = new routedata(this, new mroutehandler());
13 regex r = new regex(@"/(\w+)", regexoptions.ignorecase);
14 matchcollection mc = r.matches(httpcontext.request.path);
15 string agent = httpcontext.request.useragent.tolower();
16 foreach (string item in useragent)
17 {
18 if (agent.contains(item))
19 {
20 if (mc.count >= 2)
21 {
22 rd.values.add("controller", "m" + mc[0].groups[1].value.tostring());
23 rd.values.add("action", mc[1].groups[1].value.tostring());
24 }
25 else
26 {
27 rd.values.add("controller", "mhome");
28 rd.values.add("action", "index");
29 }
30 return rd;
31 }
32 }
33 return null;
34 }
35
36 public override virtualpathdata getvirtualpath(requestcontext requestcontext, routevaluedictionary values)
37 {
38 return null;
39 }
40 }
复制代码
最后我们将该自定义路由添加进来(routeconfig.cs):
复制代码
1 public class routeconfig
2 {
3 public static void registerroutes(routecollection routes)
4 {
5 routes.add(new customroutebase("iphone", "ipad", "android"));
6
7 routes.maproute(
8 name: "default2",
9 url: "test.html",
10 defaults: new { controller = "home", action = "list" }
11 );
12 }
13 }
复制代码
现在你新建一个mhome的控制器,然后访问看看(建议使用google浏览器,并通过开发者工具改变useragent即可快速看到效果)。
10.自定义路由处理程序
或许你会觉得asp.net mvc的控制器太麻烦,相比而言有些功能你更希望使用一般处理程序。但是访问的时候必须使用物理路径又发觉麻烦,那么通过学习这节,你将可以将一般处理程序也加入到路由中,并且可控性很强。
首先我们必须新建一个实现iroutehandler接口的类:
复制代码
1 public class donwloadhandler : iroutehandler
2 {
3
4 public ihttphandler gethttphandler(requestcontext requestcontext)
5 {
6 return new customhandler();
7 }
8 }
9
10 public class customhandler : ihttphandler
11 {
12
13 public bool isreusable
14 {
15 get { return false; }
16 }
17
18 public void processrequest(httpcontext context)
19 {
20 context.response.write("download model");
21 }
22 }
复制代码
你们可以看到上面的源码,我是直接在下面新建了一个实现ihttphandler的类,并且在gethttphandler中将该类的实例返回,当然你还可以在这个方法中进行判断以便根据实际情况交由不同的一般处理程序去处理请求。
下面就是将这个路由处理程序添加到路由中,这里我们映射到mytest这个路径:
复制代码
1 public class routeconfig
2 {
3 public static void registerroutes(routecollection routes)
4 {
5 routes.add(new route("mytest",new donwloadhandler()));
6
7 routes.maproute(
8 name: "default2",
9 url: "test.html",
10 defaults: new { controller = "home", action = "list" }
11 );
12 }
13 }
推荐阅读
-
详解ASP.NET Core MVC 源码学习:Routing 路由
-
ASP.NET MVC5网站开发之添加删除重置密码修改密码列表浏览管理员篇2(六)
-
ASP.NET MVC5网站开发之登录、验证和注销管理员篇1(六)
-
详解ASP.NET Core MVC 源码学习:Routing 路由
-
学习ASP.NET MVC5框架揭秘笔记-ASP.NET MVC路由(三)
-
ASP.NET MVC学习之路由篇(3)
-
使用Asp.Net Core MVC 开发项目实践[第四篇:基于EF Core的扩展2]
-
ASP.NET Core MVC学习教程之路由(Routing)
-
ASP.NET Core MVC基础学习之局部视图(Partial Views)
-
ASP.NET MVC学习之NuGet在VS中的运用浅谈