利用Asp.net实现简单的MVC

  • Post author:
  • Post category:其他


认识Asp.net MVC

Asp.net是微软提供的用于网站开发的基础框架。Asp.net MVC是在Asp.net的基础上实现的MVC模式,Asp.net Webform 是在asp.net的基础上实现了事件请求机制。Asp.net WebForm与Asp.net MVC是asp.net基础上的两种不同的编程框架。

Asp.net WebForm处理流程

客户端浏览器向服务其发出请求—>IIS服务其接受请求—>IIS交由asp.net处理,asp.net请求管道机制(过滤请求,根据请求选择不同处理程序)—->处理程序

IHandler

根据

HttpContext.HttpRequest

读取用户请求信息,

HttpContext.HttpResponse

写入服务器响应流(如下图)

其实就是各流处理,客户端根据Http协议发出请求流—>服务端根据请求流发送到客户端响应流

1236909-20180810183237177-781834431.png

Asp.net WebForm实现MVC

实现思想:通过实现

IHttpModule

注入asp.net请求管道,并调用将请求交由实现的

IHttpHandler

类,在

IHttpHandler

处理用户请求。具体实现过程

  1. 实现

    IHttpModule

    并通过config注入管道(IIS的

    Integrated



    Classic

    模式写法不同)
  2. 通过

    Route

    得到

    RouteData



    RouteData

    指明了

    IHandler

  3. IHandler

    的执行需要调用用户请求

    Controller

    下的

    Action

  4. Controller

    相关类通过

    IControllerFactory

    得到

    Controller

  5. ActionInvoker

    执行

    Controller

    下的

    Action

  6. IModelBinder

    根据用户请求中的数据绑定到

    Action

    的参数

  7. ActionResult

    根据

    Action

    返回值,写入

    HttpContext.HttpResponse

    响应流

    1236909-20180810183253061-588438969.png

具体实现分析

Route实现


Route

最终需要得到的值为

RouteData

,

RouteData

包括

IHandler

和从请求中提取的

Controller



Action

值。为了使用的灵活性,满足可以根据用户定义URL模板。


  • Route

    主要根据URL模块提取用户请求,指明

    IHandler


  • RouteTable

    包括

    Route

    的集合对象,作用可以声明多个

    Route
  • 服务开启时注入

    Route

1236909-20180810183303902-637643935.png

Controller实现


IRouteHandler

通过

Controller



Action

的值得到实体


  • IRouteHandler

    获得

    IHandler

  • IControllerFactory

    通过工厂获得

    IController

  • ControllerBuilder

    在服务启动时注入

    IControllerFactory


  • DefaultControllerFactory

    通过反射或取Web端下的

    Controller

1236909-20180810183320325-957306251.png

Action调用

现在已经得到了

Controller

。下面解决调用

Controller

下的

Action

.


  • IActionInvoker

    反射调用

    Action

    ,需要参数绑定

  • IModelBinder

    根据请求数据绑定参数

  • ActionResult

    根据

    Action

    执行的返回值写入响应流

1236909-20180810183331274-1452788667.png

转载于:https://www.cnblogs.com/LoveTomato/p/9456809.html