今天在园子看到《深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的》之后,本来是不打算开博来续这个后传,不过,在那边回了个评论之后,似乎还觉得意犹未尽,或许可以更具体的来讨论一下了。也是随兴所至,如有不当,请见笑。

蒋先生还真是高产,而且也是大牛。往往寥寥数语就直击要害,然后再细细分说,读来如饮佳酿,唇齿俱香。在《ASP.NET MVC4 框架揭秘》第二章的开头,他就写道:HttpModule和HttpHandler是ASP.NET管道的两个重要的纽件。请求的最终处理通过Handler来完成,ASP.NETMVC就是通过一个名为MvcHandler的自定义HttpHandler实现了对Controller的激活和Action的执行

但是他还是很负责任的把前面对Controller和Action名称的解析简单模拟出来了。出于对他这个小框架的学习,我将其的关系图用Word画了出来。

深入研究MiniMVC之后续篇

你没有看错,就只有22个文件就把这个MVC讲的很清楚了。从上面的图我们可以看出来,前两排的东西,基本上在System.Web.Routing里面已定义好了,我们难道还要再造一遍吗,出于蒋先生的讲解,写一遍无可厚非,但是作为学习者,在理解的基础上,我认为可以改造一下。故,我决定要用源生的asp.net 的路由。

且先来看一下原生的路由是怎样的吧,图中我将蒋先生在Mini里面出现了的类名标示了一下。

深入研究MiniMVC之后续篇

其实,改造还是蛮简单的。先去掉重复的类,然后再Global里面注册路由规则,再者就是注释掉原web.config里面的自定义的UrlRoutingModule。为了不至于在Global里面注册路由规则时出现自定义的IRouteHandler的名字出来,我扩展了RouteCollection的方法了。

using System;
using System.Web.Routing;

namespace Artech.MiniMvc
{
    public static class MyRouteExtension
    {
        public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults)
        {
            return MapRoute(routes, name, url, defaults, null, null);
        }

        public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
        {
            if (routes == null)
            {
                throw new ArgumentNullException("routes");
            }
            if (url == null)
            {
                throw new ArgumentNullException("url");
            }
            // 在这里注册 Route 与 MvcRouteHandler的映射关系
            Route route = new Route(url, new MvcRouteHandler())
            {
                Defaults = new RouteValueDictionary(defaults),
                Constraints = new RouteValueDictionary(constraints),
                DataTokens = new RouteValueDictionary()
            };

            if ((namespaces != null) && (namespaces.Length > 0))
            {
                route.DataTokens["Namespaces"] = namespaces;
            }

            routes.Add(name, route);

            return route;
        }
    }
}
扩展RouteCollection方法

相关文章:

  • 2021-09-15
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-05
  • 2021-08-26
  • 2021-09-12
猜你喜欢
  • 2022-12-23
  • 2021-12-27
  • 2022-01-26
  • 2022-01-22
  • 2022-12-23
  • 2022-02-03
  • 2022-12-23
相关资源
相似解决方案