【ASP.NET自己写MVC框架】2、初步实现MVC的Controler和View

来源:互联网 发布:2个月瘦10斤 知乎 编辑:程序博客网 时间:2024/05/21 14:57

        我们已经截获了浏览器的do请求,并可以自己处理。接下来,怎样根据不同的do请求,执行不同的任务呢?微软的做法是在website:Global.asax中设置类似路由的功能。这里提供另外一种思路:xml配置。

        website根目录下新建FxConfig文件夹,添加一个FxConfig.xml文件:

        一眼就可以看出这样配置是什么意思

        让FxHttpHandler接到square请求后,MySite.Actions.SquareAct类(的某个方法),这个类在MySite程序集dll中,执行完成后,目标页面是Result.aspx;不幸出错则跳到ErrorPage.aspx。

 

改造FxHttpHandler.ProcessRequest(HttpContext context):

1.把配置文件读进内存。(不能每次请求都读一次啊,以后改进)

2.得到请求的Action名。

        context.Request.Url.AbsolutePath =》*/square.do

        action名就从路径中得到咧:square

3.于是知道了应该执行MySite.Actions.SquareAct中的某个方法(统一定义为Excute()),反射之。

4.如何确定执行成功与否呢?约定Excute()成功返回true,否则返回false。

5.根据执行结果跳转到FxAction配置的页面去。

-----------------------------------------

a.为了集中管理数据,把页面传来的数据放进一个Hashtable中:

b.SquareAct实例化后,强转成Action类,执行Excute方法,需要定义Action的父类,且有一个虚方法Excute():

这个方法解释一个Hashtable参数,其中放置页面传来的数据供Action操作,处理完成后,结果还放在里面送回页面去。

        于是乎,现在这个Controler已经可以根据配置灵活干活了。

3. 在不同的页面都要取出exeData显示其中的数据,那么可以定义一个页面基类,方便子页面使用数据。FxMVC.View.FxPage:System.Web.Page,并提供一个属性:

 

        于是乎,View部分也有雏形了。

/*=====Result.aspx=============*/

<%@ Page Language="C#" Inherits="FxMVC.Views.FxBasePage" %>

计算结果:<%=ViewData["number2"] %>

/*=====ErrorPage.aspx=============*/

<%@ Page Language="C#" Inherits="FxMVC.Views.FxBasePage" %>

出错了:<%=ViewData["fx_errorMessage"] %>

 

出一口气休息一下,思路更加明确了。当然现在还是有很多需要改进的地方,比如

1、每次请求都去读一次配置文件(可:继承IHttpModule,在程序启动时只读一次,缓存起来);

2、action的配置需要进一步完善,以实现更强大的功能和更灵活的控制。

3、反射后的实际执行类,也应该缓存起来,毕竟每次请求都反射的话,很累机器的。

下回分解。

原创粉丝点击