当前位置: 移动技术网 > IT编程>开发语言>.net > 学习ASP.NET MVC5框架揭秘笔记-ASP.NET MVC是如何运行的(一)

学习ASP.NET MVC5框架揭秘笔记-ASP.NET MVC是如何运行的(一)

2018年03月10日  | 移动技术网IT编程  | 我要评论

穿越宇宙壁垒,动物世界之狼,吴湛辉 自杀

ASP.NET MVC是如何运行的

ASP.NET由于采用了管道式设计,所以具有很好的扩展性,整个ASP.NET MVC应用框架就是通过扩展ASP.NET实现的。通过上面对ASP.NET管道设计的介绍我们知道,ASP.NET 的扩展点主要体现在HttpModule和HttpHandler这两个核心组件之上,整个ASP.NET MVC框架就是通过自定义的HttpModule和HttpHandler建立起来的。

接下来我们通过自定义组件来模拟ASP.NET MVC的运行原理。

1.4.1建立在迷你版ASP.NET MVC上的Web应用

在介绍我们自己的ASP.NET MVC的实现原理之前,我们先来看看建立在我们自己的框架之上的Web应用如何来搭建。我们用VS建立一个空ASP.NET Web应用。

我们首先定义了如下一个SimpleModule类型,它表示最终需要绑定到View上的数据。为了验证对目标Controller和Action的解析机制,SimpleModule定义的两个属性分别表示当前请求的目标Controller和Action。为了更好的演示ASP.NET MVC的参数绑定机制(Model绑定),我们为SimpleModule定义了额外3个属性Foo、Bar和Baz,并让他们具有不同的数据类型。

 

public class SimpleModel
    {
        public string Controller { get; set; }
        public string Action { get; set; }
        public string Foo { get; set; }
        public int Bar { get; set; }
        public double Baz { get; set; }
    }

 

接下来我们定义Controller和Action,我们定义了如下一个继承自抽象类ControllerBase的HomeController。定义在HomeController中的Action方法Index具有一个SimpleModel类型的输入参数,并以ActionResult昨晚返回类型。

 

public class HomeController : ControllerBase
    {
        public ActionResult Index(SimpleModel model)
        {
            Action callback = writer =>
            {
                writer.Write(string.Format("Controller: {0}
Action: {1}

", model.Controller, model.Action));
                writer.Write(string.Format("Foo: {0}
Bar: {1}
Baz: {2}", model.Foo, model.Bar, model.Baz));
            };
            return new RawContentResult(callback);
        }
    }

 

方法Index返回一个RawContentResult对象。RawContentResult对象是对一个Action委托的封装,他利用后者写入需要呈现的内容。在这里我们将作为参数的SimpleModel对象的两组属性(Controller/Action和Foo/Bar/Baz)的值显示出来。

ASP.NET MVC根据请求的URL来解析目标Controller的类型和Action方法名称。具体来说,我们会注册一些包含Controller和Action名称作为占位符的路由模板。如果请求地址符合相应地址模板的模式,目标Controller和Action的名称就可以正确地解析出来。我们在Global.asax中注册了如下一个模板“{Controller}/{Action}”的Route对象。除此之外,我们还注册了一个用于创建Controller对象的工厂DefaultControllerFactory。

 

 public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            RouteTable.Routes.Add("default", new Route { Url = "{controller}/{action}" });
            ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory());
        }
    }

 

路由实现了请求URL与目标Controller/Action之间的映射。ASP.NET MVC的路由建立在ASP.NET自身的路由系统之上,后者则通过自定义的HttpModule来实现。在我们的ASP.NET MVC框架中,我们将其命名为UrlRoutingModule,它与ASP.NET路由系统中对应的HttpModule类型同名,我们通过配置对自定义的HttpModule进行配置。

 


     
                
        
  

 

这样编程和配置工作就完成了。

上面演示了如何在我们自己创建的“迷你版”ASP.NET MVC框架上搭建一个Web应用,从中可以看到它和创建一个真正的ASP.NET MVC应用别无二致。接下来我们就逐步来分析这个自定义的ASP.NET MVC框架是如何搭建起来的,他也代表了真正的ASP.NET MVC框架的基本工作原理。

总的来说,ASP.NET MVC按照这样的流程来处理响应请求:ASP.NET MVC利用路由系统对请求URL进行解析而得到目标Controller和Action的名称,以及其他相应的路由数据。它根据Controller的名称解析出目标Controller的真正类型,并将其激活(默认情况下就是根据类型以反射的机制创建Controller对象)。接下来,ASP.NET MVC利用Action名称解析出定义在目标Controller类型中对应的方法,然后执行激活Controller对象的这个方法。Action方法可以在执行过程中直接对当前请求予以响应,也可以返回一个ActionResult对象来响应请求。对于后者,ASP.NET MVC在完成目标Action方法执行之后,会执行返回的ActionResult对象来对当前请求作最终的响应。

下一章我们来讲解这个自定义的ASP.NET MVC中的路由系统的建立。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网