轉載 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" }
);
}
}

ASP.NET MVC 路由篇二的更多相关文章

  1. ASP.NET MVC 路由(二)

     ASP.NET MVC路由(二) 前言 在上一篇中,提及了Route.RouteCollection对象的一些信息,以及它们的结构所对应的关系.按照处理流程走下来还有遗留的疑问没有解决这个篇幅就来讲 ...

  2. Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径

    Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径 我们要实现 通过路由 匹配出 博客地址 和博客文章地址 例如下面的这两个地址 //http://www.cnblogs.com/ma ...

  3. ASP.NET MVC 控制器激活(二)

    ASP.NET MVC 控制器激活(二) 前言 在之前的篇幅中,用文字和图像来表示了控制器的激活过程,描述的角度都是从框架默认实现的角度去进行描述的,这样也使得大家都可以清楚的知道激活的过程以及其中涉 ...

  4. ASP.NET MVC 描述类型(二)

    ASP.NET MVC 描述类型(二) 前言 上个篇幅中说到ControllerDescriptor类型的由来过程,对于ControllerDescriptor类型来言ActionDescriptor ...

  5. ASP.NET MVC Model验证(二)

    ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...

  6. ASP.NET MVC Model绑定(二)

    ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程 ...

  7. ASP.NET MVC Model元数据(二)

    ASP.NET MVC Model元数据(二) 前言 在上篇中,给大家留个对Model元数据的印象,并没有对Model元数据有过多的讲解,而在本篇中也不会对Model元数据的本身来解释,而是针对于它的 ...

  8. ASP.NET MVC学前篇之请求流程

    ASP.NET MVC学前篇之请求流程 请求流程描述 对于请求的流程,文章的重点是讲HttpApplication和HttpModule之间的关系,以及一个简单的示例实现.(HttpModule又是M ...

  9. ASP.NET MVC 路由(一)

    ASP.NET MVC路由(一) 前言 从这一章开始,我们即将进入MVC的世界,在学习MVC的过程中在网上搜索了一下,资料还是蛮多的,只不过对于我这样的初学者来看还是有点难度,自己就想看到有一篇引导性 ...

随机推荐

  1. word在线预览编辑器

    https://blog.csdn.net/liuli283/article/details/73776685 https://blog.csdn.net/mxljiayou/article/deta ...

  2. html跳转指定位置-利用锚点

    比如我现在 a.html 的时候,我想跳转到 b.html ,并且是 b.html 的某一个位置,用 <a href=>, a.html里: <a href="b.html ...

  3. swift 学习- 27 -- 访问控制

    // 访问控制 可以限定其源文件 或模块中的代码对你的代码的访问级别, 这个特性可以让我们隐藏代码的一些实现细节, 并且可以为其他人可以访问和使用的代码提供接口 // 你可以明确地给某个类型 (类, ...

  4. Confluence 6 当前使用的数据库状态

    进入  > 基本配置(General Configuration) > 问题检查和支持工具(Troubleshooting and support tools) 你就可以看到当前使用的数据 ...

  5. Confluence 6 配置避免管理员联系表单垃圾

    你可以配置 Confluence 使用验证码(Captcha)来避免垃圾内容发送给 Confluence 管理员.有关管理员联系表单验证码的内容在全站验证码设置中进行配置,相关的文档请参考 Confi ...

  6. Confluence 6 修改站点图标(favicon)

    你也可以修改你站点的图标(这个站点图标将会在你浏览器的标签页上显示).你需要 Confluence 的管理员权限才能进行修改. 进入  > 基本配置(General Configuration) ...

  7. Pandas模块:表计算与数据分析

    目录 Pandas之Series Pandas之DataFrame 一.pandas简单介绍 1.pandas是一个强大的Python数据分析的工具包.2.pandas是基于NumPy构建的. 3.p ...

  8. java-HTML&javaSkcript&CSS&jQuery&ajax

    CSS  伪装 1.<style>a;link{color:#000000} a:visited{color:#000000; a.:hover{color:#FF00FF} a:acti ...

  9. cf441 f组合数。。单调指针

    e没学过做不出来.. 处理合法的区间很麻烦,但是处理非合法的区间很容易 答案就是所有的取法-不合法的区间 这题一定要双边界推进处理!!!! 一开始用单边界向右推进,结果后来发现错了,拿样例1就可以证明 ...

  10. light1236 素数打表,质因数分解

    不知道为什么会错 /* 求出 lcm(i,j)==n 的对数, 分解质因数,p1^e1 * p2^e2 * p3^e3 那么 i,j中必定有一个数有e1个p1因子,另一个任意即可 那么最终的结果就是 ...