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 }
  • 相关阅读:
    HTML DOM prompt() 方法
    Zen cart前台英文后台中文(Zen cart后台取消多语言输入的方法)
    Zencart模板结构和设计详解
    给zencart添加一个fckeditor编辑器
    mssql重置表
    Guid与id区别
    zencart五款是必备的插件
    C#使用HTTP头检测网络资源是否有效
    OA系统权限管理设计方案
    C#获取网页http头的方法(附代码)
  • 原文地址:https://www.cnblogs.com/kfx2007/p/2981898.html
Copyright © 2011-2022 走看看