• 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 }
  • 相关阅读:
    PHP:_SERVER变量和_ENV变量列表
    一些使用jQuery開發的在線Web富文本編輯器
    xhtml+css排版,清理浮动整理汇总
    PHP 6 的新特性
    用PHP的CURL写的一个采集Discuz的例子
    SA、SD、SE 这三者的含义及区分
    PHP 之父 Rasmus Lerdorf 谈PHP开发
    http头的组成
    Jquery插件 可以随着滚动条的滚动而即时加载图片
    在你的网页中嵌入PDF等文件,实现pdf在线阅读
  • 原文地址:https://www.cnblogs.com/kfx2007/p/2981898.html
Copyright © 2020-2023  润新知