ASP.NET MVC学习之路由篇(2)
原文:ASP.NET MVC学习之路由篇(2)

继ASP.NET MVC学习之路由篇(1)后继续学习。

7.解决与物理路径的冲突

当发送一个请求至ASP.NET MVC时,其实会检查网站中存不存在这个请求的物理路径文件,如果存在的话,就会直接将这个物理文件返回。但是有时候我们需要它执行控制器的某个方法,而不是直接将这个物理文件返回。那么我们就需要这节知识。下面我们先在网站根目录中新建一个 Test.html ,在其中随便写上一些内容,然后访问。再在RouteConfig.cs中写入如下代码:

 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 MvcRouteHandler());
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     }

接着我们访问http://localhost:2392/MyTest就可以看到结果了。

posted on 2014-05-20 14:05 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/3738796.html

ASP.NET MVC学习之路由篇(2)相关推荐

  1. ASP.NET MVC学习之控制器篇

    一.前言 许久之后终于可以继续我的ASP.NET MVC连载了,之前我们全面的讲述了路由相关的知识,下面我们将开始控制器和动作的讲解. ASP.NET MVC学习之路由篇幅(1) ASP.NET MV ...

  2. (转)ASP.NET MVC 学习第一天

    天道酬勤0322 博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅  | 管理 随笔:10 文章:0 评论:9 引用:0 ASP.NET MVC 学习第一天 今天开始第一天学习asp. ...

  3. ASP.NET MVC学习资料 新增几个开源项目

    ASP.NET MVC学习资料 新增几个开源项目 ASP.NET MVC MSDN API:  System.Web.Mvc Namespace (暂无中文版):  http://msdn.micro ...

  4. 为ASP.NET MVC应用添加自定义路由

    这里,我们将学习如何给asp.net mvc应用添加自定义路由.用自定义路由来修改默认路由表. 对一些简单的asp.net mvc应用,默认的路由表就已经足够了.但是,当你需要创建特殊的路由时,就需要 ...

  5. (asp.net MVC学习)System.Web.Mvc.UrlHelper的学习与使用

    上一次学习了HtmlHelper帮助类,这次我们学习一下UrlHelper帮 助类,看类名也都知道这个类是用来帮我们生成URL在ASP.NET MVC应用程序中.让我们来看看该类给我们带来了哪些方便的 ...

  6. ASP.NET MVC学习系列(一)-WebAPI初探

    由于即将要接手的新项目计划用ASP.NET MVC3来开发,所以最近一段时间一直在看相关的书或文章.因为之前在大学里也曾学习过MVC2开发,也做过几个简单的MVC2的小型测试项目,不过在后来工作以后主 ...

  7. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第二篇:第一个页面

    摘要       本文首先一步一步完成Demo的第一个页面--首页.然后根据实现过程,说明一下其中用到的与ASP.NET MVC相关的概念与原理. 让第一个页面跑起来       现在,我们来实现公告 ...

  8. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第一篇:准备工作

    摘要       本文将简要介绍这个文章系列的目的.形式及大体内容.并且完成开始学习这个系列前所必要的准备工作. 前言       ASP.NET MVC作为微软官方的MVC解决方案,推出有一段时间了 ...

  9. Asp.net Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则 (多级路由) 如:Admin/Test/Index...

    http://blog.csdn.net/buhuan123/article/details/26387427 目录(?)[-] 1那么我们再来看我们需要的访问方式如下图 razor视图的地址写成通配 ...

最新文章

  1. 反爬虫——使用chrome headless时一些需要注意的细节
  2. 用python绘制柱状图标题-Python数据可视化:5种绘制柱状图表的方法(附源码)...
  3. jquery的checked以及disabled
  4. 北大OJ百练——3179:最长单词(C语言)
  5. java 模板方法设计模式_Java中的模板方法设计模式
  6. centos7不中断执行命令
  7. 网络 应用层 | HTTP的认识及实现(模拟实现一个简单的服务器)
  8. 常用算法2 - 广度优先搜索 深度优先搜索 (python实现)
  9. jQuery-JS在iframe中获取父页面的值
  10. NO Scala sdk module
  11. 经纬度换算数值_经纬度换算
  12. java开发面试自我介绍模板_java程序员面试自我介绍范文(精选3篇)
  13. Rstudio 设置工作路径
  14. 位(bit), 字节(byte), 字(word),双字(dword or Qword)释义
  15. 时间序列分析-如何写出ARIMA模型的公式
  16. MySQL报错问题:2509
  17. 【机器人学】机器人学领域的顶级期刊和会议
  18. STM32网址大全(快速定位网址查找资料)
  19. 食品安全大数据可视化关联分析
  20. File常用方法,不积硅步无以至千里

热门文章

  1. sqlite不存在记录则插入数据
  2. SpringMVC中的文件上传
  3. fhqtreap的学习笔记
  4. ASP.NET MVC 的一个配置节点
  5. [转]C#中的委托和事件(续)
  6. 基于jquery的图片懒加载js
  7. Google也开始弄开源平台,好事啊
  8. Lint found fatal errors while assembling a release target
  9. 【封装那些事】 缺失封装
  10. 简单配置jena在eclipse的开发环境