词条统计
浏览次数:9099 次
编辑次数:1次 历史版本
最近更新:2013/6/20
创建者:掷鸡蛋者


wojilu MVC 的模板引擎是非常简单的。
您只能在视图页面中使用变量和循环,无法使用脚本语言具有的数据转换、if/else等逻辑。
而这是故意为之。
如果想要一个强大的模板引擎,干嘛不直接用 ASP.NET 的webform?反正可以在asp.net页面中嵌入任何 c# 代码。

良好的web开发,有很多的标准。对于视图页面,我觉得其中重要的标准就是:

1、没有脚本化的内容,没有视图逻辑,一看就懂;
2、直接基于html,美工不需要学习额外的知识(比如服务器端控件知识等),就可以直接上手。
3、简单易用的语法。

wojilu MVC 的模板引擎就是为了这个干净的视图目标而度身订造的。

那复杂的视图逻辑怎么办?该有的逻辑总归是要有的,您逃也逃不掉!没错,所以——
wojilu MVC 的处理方式是,将视图逻辑收入controller控制器中。


具体如何做?我们看一个例子:
在这个例子中,我们增加了一个action,名叫List,用于显示文章列表。这个显示列表包含了两个视图逻辑:
    1、如果标题文字数量少于8个,则粗体显示
    2、如果内容文字数量多于20个,则只截取前20个字符显示

先看下效果图:

首先,我们给 Layout 布局添加到新方法的链接:

然后,我们添加List.html视图页面。我们看到,视图界面依然简单:

但controller的List方法的实现就复杂多了:

如果您对web开发的MVC模式有过了解,看到这里,您可能会眉头皱了起来:

controller只是用来获取模型数据然后渲染给视图引擎的,最多加上一些转发请求等轻量级处理。您却搞得这么臃肿?

没错,您的看法确实是目前MVC的主流处理方式。但 wojilu 却对这种处理方式颇有微词:controller 是瘦身了(thin),视图view呢?

正常的项目,绝非像前面的代码一样那么简单的,在视图中出现if/else的需求,那是再普遍、再正常不过的现象了。换句话说,视图逻辑是固定需求,我们避免不掉的,正如人要吃饭:要么在家里吃,要么在外面吃,您总得吃!视图逻辑也一样,您要么放在视图模板中,要么放在控制器中(其实还有两种方式:1放在领域模型中,或2另建视图模型,这两种做法我们另说)。

那么,在

1、瘦身的 controller + 膨胀的 view
2、膨胀的 controller + 瘦身的 view

两种模式之间,您愿意选择哪种方式?

wojilu MVC 毫不犹豫的选择了后者。相比较视图页面的恶劣工作环境,在后端controller中编写视图逻辑,那要稳定、快速、可靠得多!IDE的强类型支持,重构的迅捷无碍,那得节省视图页面的磨磨唧唧多少时间?

现在,您是否愿意接受一个简单、清晰的视图,但却逐渐膨胀的controller?不要害怕,controller并非一定要这样无限制的膨胀下去,我们可以重构的:

1、将试图逻辑通过IDE的“重构->提取方法”,提取取来
2、然后放入controller的部分类(partial)中,以保持主体controller的清晰。这样控制器的职责和视图逻辑的职责各得其所。

看一下最终拆分的代码样子:

右侧的主controller文件又恢复到干净简洁的状态。
项目文件结构如下图:

 

说明:图中的 partial 文件夹和其中的ArticleController.cs文件都是手动建立的,IDE并不支持直接拆分出partial类的功能。不用怕,这个手动过程其实一点都不复杂。