zoukankan      html  css  js  c++  java
  • MVC3 自定义路由 Kevin

    一、 自定义路由需要继承RouteBase类

    RouteBase类有两个抽象方法:1.GetRouteData和GetVirtualPath

    GetRouteData用于重构RouteData数据,GetVirtualPath用于重写产生的URL。

    下面通过一个例子来说明如何自定义自己的路由:

    1. 新建一个Controller

    View Code
    1 namespace URLsAndRoutes.Controllers {
    2 public class LegacyController : Controller {
    3 public ActionResult GetLegacyURL(string legacyURL) {
    4 return View((object)legacyURL);
    5 }
    6 }
    7 }

    2.自定义路由类

    View Code
     1 public class LegacyRoute : RouteBase {
     2 private string[] urls;
     3 public LegacyRoute(params string[] targetUrls) {
     4 urls = targetUrls;
     5 }
     6 public override RouteData GetRouteData(HttpContextBase httpContext) {
     7 RouteData result = null;
     8 string requestedURL =
     9 httpContext.Request.AppRelativeCurrentExecutionFilePath;
    10 if (urls.Contains(requestedURL, StringComparer.OrdinalIgnoreCase)) {
    11 result = new RouteData(this, new MvcRouteHandler());
    12 result.Values.Add("controller", "Legacy");
    13 result.Values.Add("action", "GetLegacyURL");
    14 result.Values.Add("legacyURL", requestedURL);
    15 }
    16 return result;
    17 }
    18 public override VirtualPathData GetVirtualPath(RequestContext requestContext,
    19 RouteValueDictionary values) {
    20 return null;
    21 }
    22 }

    3.在Global.acax.cs文件中注册自定义路由

    View Code
    1 public static void RegisterRoutes(RouteCollection routes) {
    2 routes.Add(new LegacyRoute(
    3 "~/articles/Windows_3.1_Overview.html",
    4 "~/old/.NET_1.0_Class_Library"));
    5 routes.MapRoute("MyRoute", "{controller}/{action}/{id}",
    6 new { controller = "Home", action = "Index", id = UrlParameter.Optional });
    7 }

    运行程序

    二、自定义生成URL

    重写VirtualPathData方法:

    View Code
     1 public override VirtualPathData GetVirtualPath(RequestContext requestContext,
     2 RouteValueDictionary values) {
     3 VirtualPathData result = null;
     4 if (values.ContainsKey("legacyURL") &&
     5 urls.Contains((string)values["legacyURL"], StringComparer.OrdinalIgnoreCase)) {
     6 result = new VirtualPathData(this,
     7 new UrlHelper(requestContext)
     8 .Content((string)values["legacyURL"]).Substring(1));
     9 }
    10 return result;
    11 }

    在页面中添加连接:

    View Code
    1 @Html.ActionLink("Click me", "GetLegacyURL", new { legacyURL =
    2 "~/articles/Windows_3.1_Overview.html" })

    三、自定义路由处理类

    Mvc默认使用 MvcRouteHandler来处理URL,同时,MVC框架允许我们自定义自己的RouteHandler类。我们只需要实现IRouteHandler类:

    View Code
     1 public class CustomRouteHandler : IRouteHandler {
     2 public IHttpHandler GetHttpHandler(RequestContext requestContext) {
     3 return new CustomHttpHandler();
     4 }
     5 }
     6 public class CustomHttpHandler : IHttpHandler {
     7 public bool IsReusable {
     8 get { return false; }
     9 }
    10 public void ProcessRequest(HttpContext context) {
    11 context.Response.Write("Hello");
    12 }
    13 }

    然后在注册一下:

    View Code
    1 public static void RegisterRoutes(RouteCollection routes) {
    2 routes.Add(new Route("SayHello", new CustomRouteHandler()));
    3 routes.MapRoute("MyRoute", "{controller}/{action}/{id}",
    4 new { controller = "Home", action = "Index", id = UrlParameter.Optional });
    5 }
  • 相关阅读:
    jQuery---三组基本动画 show hide
    jQuery---表格全选案例
    jQuery---prop方法和表格全选案例
    jQuery---美女相册案例
    jQuery---属性操作
    jQuery---tab栏切换
    jQuery---Class操作
    jQuery---CSS操作
    jQuery---第一部分复习
    DirBuste 使用
  • 原文地址:https://www.cnblogs.com/kfx2007/p/2981898.html
Copyright © 2011-2022 走看看