轉載 http://www.cnblogs.com/yaozhenfa/p/asp_net_mvc_route_2.html

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

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

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.RouteExistingFiles = true; routes.MapRoute(
name: "Default2",
url: "Test.html",
defaults: new { controller = "Home", action = "List" }
);
}
}

这个时候我们再重新刷新浏览器,那么我们就可以看到控制器返回的结果了,这样我们就解决了物理路径和路由之间的冲突问题了。

8.绕过路由系统

如果我们有一些URL路径不希望通过路由系统,那么我们就可以利用这节知识。

下面是RouteConfig.cs的内容:

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("webResources.axd{*pathinfo}"); routes.MapRoute(
name: "Default2",
url: "Test.html",
defaults: new { controller = "Home", action = "List" }
);
}
}

9.自定义路由系统

如果上面的技术还无法解决你的问题,那么我们下面将会介绍如何自定义路由系统。自定义路由系统只需要继承RouteBase并实现两个方法,如下:

(1):GetRouteData

(2):GetVirtualPath

下面是我写的一个简单示例,用来判断访问者是否是移动设备,如果是移动设备则路由到前缀为M的控制器处理请求,否则返回NULL交由默认的路由

处理,下面为我的源码:

public class CustomRouteBase : RouteBase
{
private List<String> userAgent; public CustomRouteBase(params String[] userAgents)
{
userAgent = userAgents.ToList();
} public override RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData rd = new RouteData(this, new MvcRouteHandler());
Regex r = new Regex(@"/(\w+)", RegexOptions.IgnoreCase);
MatchCollection mc = r.Matches(httpContext.Request.Path);
String agent = httpContext.Request.UserAgent.ToLower();
foreach (String item in userAgent)
{
if (agent.Contains(item))
{
if (mc.Count >= 2)
{
rd.Values.Add("controller", "M" + mc[0].Groups[1].Value.ToString());
rd.Values.Add("action", mc[1].Groups[1].Value.ToString());
}
else
{
rd.Values.Add("controller", "MHome");
rd.Values.Add("action", "Index");
}
return rd;
}
}
return null;
} public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
return null;
}
}

最后我们将该自定义路由添加进来(RouteConfig.cs):

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add(new CustomRouteBase("iphone", "ipad", "android")); routes.MapRoute(
name: "Default2",
url: "Test.html",
defaults: new { controller = "Home", action = "List" }
);
}
}

现在你新建一个MHome的控制器,然后访问看看(建议使用Google浏览器,并通过开发者工具改变UserAgent即可快速看到效果)。

(2):GetVirtualPath

下面是我写的一个简单示例,用来判断访问者是否是移动设备,如果是移动设备则路由到前缀为M的控制器处理请求,否则返回NULL交由默认的路由

处理,下面为我的源码:

10.自定义路由处理程序

或许你会觉得ASP.NET MVC的控制器太麻烦,相比而言有些功能你更希望使用一般处理程序。但是访问的时候必须使用物理路径又发觉麻烦,那么通过学习这节,你将可以将一般处理程序也加入到路由中,并且可控性很强。

首先我们必须新建一个实现IRouteHandler接口的类:

public class DonwloadHandler : IRouteHandler
{ public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new CustomHandler();
}
} public class CustomHandler : IHttpHandler
{ public bool IsReusable
{
get { return false; }
} public void ProcessRequest(HttpContext context)
{
context.Response.Write("download model");
}
}

你们可以看到上面的源码,我是直接在下面新建了一个实现IHttpHandler的类,并且在GetHttpHandler中将该类的实例返回,当然你还可以在这个方法中进行判断以便根据实际情况交由不同的一般处理程序去处理请求。

下面就是将这个路由处理程序添加到路由中,这里我们映射到MyTest这个路径:

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add(new Route("MyTest",new DonwloadHandler())); routes.MapRoute(
name: "Default2",
url: "Test.html",
defaults: new { controller = "Home", action = "List" }
);
}
}

最新文章

  1. svn: how to set the executable bit on a file?
  2. 水晶报表初体验(Visual Studio 2010)
  3. MongoDB学习笔记五:聚合
  4. Network - 互联网协议入门
  5. 让树莓派开机发送自己的ip到邮箱
  6. 弹出层和ajax数据交互
  7. 互斥对象 Mutex 和MFC中的CMutex
  8. 微软Azure云主机及blob存储的网络性能测试
  9. Android onActivityResult 设置requestCode 返回的code不对
  10. php call_user_func和call_user_func_array
  11. WCF 项目应用连载[8] - 绑定、服务、行为 大数据传输与限流 - 下 (ServiceThrottlingAttribute)
  12. Android自定义控件之TextView
  13. Nginx性能优化技巧(6)
  14. pytorch的函数中的dilation参数的作用
  15. Java类型信息之RTTI
  16. 深入浅出ES6:不定参数和默认参数
  17. 区分Python中的id()和is以及Python中字符串的intern机制
  18. 搜索+剪枝——POJ 1011 Sticks
  19. HTML 视频
  20. Linux服务器上Tomcat的Web工程部署

热门文章

  1. Android录制音频的三种方式
  2. java基础题刷题中的知识点复习
  3. Oracle+PL+SQL从入门到精通.丁士锋.清华大学出版社.2012
  4. Confluence 6 安装一个语言组件
  5. Confluence 6 MBeans
  6. Confluence 6 附件存储提取文本文件
  7. Confluence 6 为翻译显示用户界面的键(Key)名称
  8. Vue2 Virtual DOM
  9. PDF如何去除背景,PDF去除背景颜色
  10. django----多对多数据添加