超级简单的视图引擎
原文地址:https://github.com/NancyFx/Nancy/wiki/The-Super-Simple-View-Engine
超级简单的视图引擎又被称作SSVE,是一种基于视图引擎的正则表达式。它被设计用来实现简单的模板方案,因此很多你在其它模板看到的特性,它可能是不支持的。
你使用这个引擎的时候并不需要再安装一个Neget,因为它已经嵌入到Nancy的主要配置中了,所以它内部会自动连接起来,你只需要使用就可以了。该引擎可以处理 sshtml
, html
或 htm
格式的文件。
Modles可以是标准类型或者ExpandoObjects
(而事实上,任何实现了IDynamicMetaObjectProvider的类型都可以实现 IDictionary<string, object>
来访问它的属性)。
所有的命令都有一个用来消除模糊概念的可选点号分隔符。任何一个[.Parameters]参数都可以是多层次的。比如: This.Property.That.Property
因为SSVE是基于视图引擎的正则表达式,它并没有“执行代码”,所以你不能随意指定你自己的代码块来让它执行。下面是它可以接受的语法和命令。
请注意,表达式中的所有引号都应该是单引号。
标准的变量替换
用参数的字符串形式来替换,如果没有指定参数,那么参数就是模型本身。如果要字符串无法被解析出来,或者如果你指定了一个非法的model属性,那么它会由[Err!] 替换掉。
语法:
@Model[.Parameters]
例子:
Hello @Model.Name, your age is @Model.User.Age
迭代器
确定你的model是可被遍历的集合。迭代器无法被嵌套。
语法:
@Each[.Parameters]
[@Current[.Parameters]]
@EndEach
@Each 会隐式的关联到model,而每一次遍历,@Current就会将当前集合中的元素显示出来。在每一次遍历的代码块中,@Current可以多次被使用,访问形式和@Model是一样的。
例子:
@Each.Users
Hello @Current.Name!
@EndEach
条件:
参数必须是boolean类型的(可以看下面的隐式条件)。@If和@IfNot语句是不可以嵌套的。
语法:
@If[Not].Parameters
[contents]
@EndIf
例子:
@IfNot.HasUsers
No users found!
@EndIf
隐式条件:
如果model实现了ICollection那么你就可以使用隐式条件。隐式条件的语法和正常条件语法是一样的,只是Parameters(参数)部分的字首有一个Has。如果集合有当前值,那么条件就是true,如果没有或者是null则是false。
例子:
Has[CollectionPropertyName]
语法:
@If.HasUsers
Users found!
@EndIf
上面这个简单的例子中,如果model中有一个Users集合并且含有值,那么“Users found!”就会被展开,否则就不会展开。
HTML编码
@Model和@Currentkeywords(带或者不带参数)都可以在@后面加一个!符号,来使HTML编码输出。
语法:
@!Model[.Parameter]
@!Current[.Parameter]
例子:
@!Model.Test
@Each
@!Current.Test
@EndEach
布局
渲染一个局部视图。当前model的一个属性可以用一个局部视图模型来指定,否则默认使用当前视图引擎。文件扩展名是可选的。
语法:
@Partial['<view name>'[, Model.Property]]
例子:
// Renders the partial view with the same model as the parent
@Partial['subview.sshtml'];
// Renders the partial view using the User as the model
@Partial['subview.sshtml', Model.User];
模板页和布局
你可以将要共享的布局放在一个master页面中。然后在你需要显示的页面中声明内容部分。Master页面是允许嵌套的,而你并不需要为所有的内容部分填充内容。
Master页面可以找到你所要的视图的@model ,而当你指定master填充你的视图
时,文件扩展名是可选的。
语法:
@Master['<name>']
@Section['<name>']
@EndSection
例子:
// master.sshtml
<html>
<body>
@Section['Content'];
</body>
</html>
// index.sshtml
@Master['master.sshtml']
@Section['Content']
This is content on the index page
@EndSection
防伪标记
在页面中隐式输入防伪标记,防止跨站点请求的伪造攻击。当一个新的请求被发送到服务器时,它会自动进行防伪验证(假设CSRF保护没有被关闭)。
语法:
@AntiForgeryToken
例子:
@AntiForgeryToken
路径扩展
将相对路径扩展成完整的路径。
语法:
@Path['<relative-path>']
例子:
@Path['~/relative/url/image.png']
扩展SSVE
SSVE是支持新增“匹配器”从而满足你的需求的。点这里(http://stackoverflow.com/questions/21910778/localization-in-nancy-without-the-razor-viewengine/23614404#23614404),有一个例子教你怎么新增匹配器。这篇教程中,描述了如何扩展SSVE来支持类似于“"@Text.TranslationKey"”(象征着Razor视图引擎)的文本翻译替换。