MVC框架可以分为M和V和C,这不用我说大家也知道。M代表的也就是通常所说的实体类(Model),主要用来传递数据的;V也就是表现层(View),在本框架中是用一个html页面来实现;C也就是控制类(Controller),它是我们实现后台数据与前台表现相结合的地方。
View主管数据的呈现逻辑,所有与展示有关的事情应该在这里实现(为什么说是应该,因为有些逻辑如果用模板目前所支持的语法不能实现的话,那只好在C里去实现了)。View目前支持的语句有if、foreach、write;write语句支持两种形式,一种是write(“something”)一种是直接在html里输出内容的<%=”something”%>,if语句与C#的类似,但目前不支持if()elseif()else这样的形式,只支持if()else()这样的形式;foreach语句也类似于C#里的foreach,但不支持强类型,而应该写成foreach(var table in tables).下面举一个例子:
if语句的运用:
(例1)
说明:$a 为控制类C里设置的变量,建议所有后台设置的变量名都用$开头,这里我们阅读模板的时候能很容易清楚哪些变量是在控制类里设置的。
foreach语句的运用:
(例2)
说明:目前$tables只能是Array或者是实现了IList或ICollection 接口的对象。
从上面的两个语句的运用中我们能看到write语句的两种运用形式,需要特别说明的是目前write语句只支持输出单个简单对象,不支持运算表达式,如果这个限制对我们的使用影响比较大的话,日后会改造它。
Controller主要用来做数据填充和数据接收,具体的业务逻辑建议写到BLL层里。所有的页面控制类必需要继承PageController,不过我已经在项目里加了两个页面控制基类BasePageController和RestrictedPageController,他们都继承于PageController,所以我们在实际的开发中可以根据需要继承于这两个类,也可以根据需要建自己的基础控制类。所有的页面控制类都应该有一个public void Run()的方法,Run()方法是默认执行的方法,也就是说在访问这个页面的时候如果不指定方法名就会执行这个方法。页面控制类有一条严格的限制,也就是它和它的基类都不可以有重名的公有函数,也就是说不支持重载。
页面控制类支持三种方法,以Setup开头的设置方法,以Teardown开头的卸载方法,以Ajax开头的Ajax方法,另一种就是不以以上三种符号做前缀的普通方法。设置方法会在普通方法之前执行,卸载方法会在普通方法之后执行;如果请求Ajax方法,不会导致设置方法和卸载方法的执行。
控制类的方法支持单类型的参数和Array还有实现IList、IDictionary接口的对象,从前台传过来的字符串只要符合JSON格式,就会自动被反序列化到对应的参数中。
一个完整的后台控制类的例子:
(例3)
说明:ViewData[“$a”]代表的是前台模板里的变量$a,参见例1;ViewData[“$tables”]代表的是前台模板里的变量$tables,我们在控制类里给它设置数据源。
例3未提供参数执行后输出的结果:
说明:因为a为Run的参数,我们未在请求这个页面的时候给提供参数,所以它的默认值为0,因此它大于10的这个判断为假,所以输出的是这个结果。
提供参数a=20后的执行结果:
请求路径与C和V的对应关系:
应用程序根目录下的default.aspx对应的页面控制类为Cvv.WebApp根命名空间下的控制类Default类,对应的模板文件为default.html,如果带有目录,如helpers/codehelper.aspx,对应的控制类为Cvv.WebApp.helpers命名空间下的CodeHelper类,对应的模板为helpers/codehelper.html。
先说到这里吧,不明白的可以直接问我。谢谢合作。