正如其他的Web工具包,Nancy也有视图的概念,用来描述在浏览器上看到的输出

视图的定义

你可能没有之前没有接触过“视图”的概念,或是仅仅是从其他工具包例如ASP.NET MVC 中听说过。(其中MVC中“V”代表“View”)

你是否想过视图到底是什么那?

根据牛津字典的释义,视图时能够看到的东西,或是在特定情况下看到的东西。

视图是终端用户在浏览器中看到的东西。根据定义浏览器中可以看到的输出都可以称之为视图。

至于我们在次的定义的视图应该是一个动态的输出,也就是说不是静态的文件。(比如编辑好的HTML文件或是PDF文件)。实际中,输出的内容应该是混合了静态内容和生成数据的结合体。

根据这个定义,使用模板页的传统Web应用(webForm)可以称之为视图,也许有人不同意。

视图引擎

简单来说,视图引擎就是根据源文件输出视图的动态库。

回到我们对视图的定义,暂停一下,想想ASP.NET MVC中的视图引擎:Razor.

有很多视图引擎供你选择,你可以选择适合你的。如果Razor(来自MVC)适合你,你可以在Nancy项目中采用Razor.还有其他的你也许会用到,NHaml,DotLiquid或 MarkDown.

你可以轻易的采用这几种引擎,只需要通过NuGet安装下就好。剩下的就是定义视图引擎规定的模板文件。

一般Nancy从Views文件夹中查找视图模板。当然这个也可以改变,之后的章节会在介绍ancy bootstrapper类时详细介绍。

创建第一个视图

让我们开始一个全新的Nancy项目,没有验证,没有MVC,不支持 Web Froms,也没有任何的初始文件。

为了演示,我们采用Nancy的默认视图引擎SSVE(Super Simple View Engine)超级简单视图引擎。

让我们增加一个简单的路由类:

namespace nancybook.modules
{
public class BaseRoutes : NancyModule
{
public BaseRoutes()
{
Get[@"/"] = _ => View["firstView/hellonancy"];
}
}
}

这个路由定义了对 / 目录的请求都会返回 默认文件夹(Views)下的firstview目录中的hellonancy.<ext> 文件。

在这里<ext> 代表文件的扩展名。

视图引擎SSVE下,sshtml, .html, 以及 .htm 都是允许的。

下面是视图模板的代码:

<!DOCTYPE html>
<html>
<head>
<title>Hello Nancy FX</title>
</head>
<body>
<h1>Hello Nancy FX</h1>
</body>
</html>

下面是解决方案浏览器中看到的样子:

点击F5,运行项目,你会在浏览器中看到HTML页面展示“Hello Nancy FX”

    稍稍提下静态内容

此时,你可能在线如何在试图中包含静态文件,比如图片,JS脚本或其他文件。Nancy一般都是用Content文件夹来放置文件,向下面这样是用:

Response.AsFile("index.html", "text/html");

那些没有文件夹前缀的都会在首先在Content目录下查找,然后再是这下面的子文件夹。

当然这个约定也可以在自定义的bootstrapper 中进行修改(后面的章节会介绍)。

再继续谈我们的视图

你已经看到了,通过视图引擎仅仅返回静态的内容是非常简单的,但我们不能止步于此。正如我在本章开始时所定义,是用视图并不是为了返回一个页面,它需要把数据和页面进行组合,然后把这两者的融合产物进行输出。

让我们添加一个类作为视图的数据模型,这个类的名字称为:FirstModel.cs

using System;
namespace nancybook
{
public class FirstModel
{
public string Name { get; set; }
public DateTime TimeOfRequest { get; set; }
}
}

还是使用我们之前的路由,添加上面类的一个实例作为页面的数据源:

using System;
using Nancy;
namespace nancybook.modules
{
public class BaseRoutes : NancyModule
{
public BaseRoutes()
{
FirstModel demoModel = new FirstModel
{
Name = "Shawty",
TimeOfRequest = DateTime.Now
};
Get[@"/"] = _ => View["firstView/hellonancy", demoModel];
}
}
}

执行后你会发现,这和之前没啥区别,是应为还没对视图进行修改。既然你已经有了数据 demoModel,你需要使用当前视图引擎支持的规则来呈现数据。

修改hellonancy.html 文件中的HTML代码:

<!DOCTYPE html>
<html>
<head>
<title>Hello Nancy FX</title>
</head>
<body>
<h1>Hello @Model.Name</h1>
<h2>The time is @Model.TimeOfRequest</h2>
</body>
</html>

重新构造你的项目,再次执行,浏览器中就能看到不一样的呈现。

SSVE是一个非常简单的引擎,但多数情况下还是很好用的。在处理的指令上可能不如其他引擎。

但这不能抹煞它的实用性。

例如,你可以使用@Each 来对集合进行循环。当使用@Each时,使用@Current 来引用当前的子项,使用@EndEach 来结束循环。

<!DOCTYPE html>
<html>
<head>
<title>Hello Nancy FX</title>
</head>
<body>
<!-- If we passed our data in as List<FirstModel> we could do the
following -->
@Each.Model
<h1>Hello @Current.Name</h1>
@EndEach
</body>
</html>

正如你期望的,这个会展示集合对象中的一连串名字。

总结

NancyFX 第六章 视图引擎的更多相关文章

  1. 《深入理解Spark-核心思想与源码分析》(六)第六章计算引擎

    RDD是Spark对各类数据计算模型的统一抽象,被用于迭代计算过程以及任务输出结果的缓存读写. 在所有MapReduce框架中,shuffle是连接map任务和reduce任务的桥梁.shuffle性 ...

  2. Spring实战第六章学习笔记————渲染Web视图

    Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...

  3. 第5章——使用 Razor(MVC框架视图引擎)

    Razor 是MVC框架视图引擎的名称. 本章提供 Razor 语法的快速教程,以使你能够识别 Razor 表达式. 本章不打算提供 Razor 的完整参考,而将其视为一个语法速成教程.在本书的后续内 ...

  4. NancyFX 第三章 Web框架

    如果使用Nancy作为一个WEB框架而言,会有什么不同?实际上很多. 在使用Nancy框架为网页添加Rest节点和路由和之前的Rest框架中是相同的,这方面没有什么需要学习的了.Nancy采用一贯的处 ...

  5. Flask 教程 第十六章:全文搜索

    本文翻译自The Flask Mega-Tutorial Part XVI: Full-Text Search 这是Flask Mega-Tutorial系列的第十六部分,我将在其中为Microblo ...

  6. ASP.NET MVC 5 Web编程4 -- Razor视图引擎

    Razor简介 Razor是ASP.NET新增的一个视图引擎,由微软全球最年轻的副总裁,有着"ASP.NET之父"称呼的Scott Guthrie主导的团队开发. 主导Razor开 ...

  7. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

  8. KnockoutJS 3.X API 第六章 组件(5) 高级应用组件加载器

    无论何时使用组件绑定或自定义元素注入组件,Knockout都将使用一个或多个组件装载器获取该组件的模板和视图模型. 组件加载器的任务是异步提供任何给定组件名称的模板/视图模型对. 本节目录 默认组件加 ...

  9. Nancy 学习-视图引擎 继续跨平台

    前面一篇,讲解Nancy的基础,以及Nancy自宿主,现在开始学习视图引擎. Nancy 目前支持两种 一个是SSVE 一个是Razor.下面我们一起学习. The Super Simple View ...

随机推荐

  1. ADO.NET通用类库

    using System.Data; using System.Data.SqlClient; namespace DataService { public class SQLHelper { pub ...

  2. PHP判断是手机端还是PC端

    function check_wap() { if (isset($_SERVER['HTTP_VIA'])) return true; if (isset($_SERVER['HTTP_X_NOKI ...

  3. PHP安全、Sql防注入安全汇总

    利用Mysqli和PDO 产生原因 主要就是一些数据没有经过严格的验证,然后直接拼接 SQL 去查询.导致漏洞产生,比如: $id = $_GET['id']; $sql = "SELECT ...

  4. java字符串以及字符类型基础

    介绍一下java字符集和字符的编码方式, 首先要区分一下字符集和字符编码.所谓的字符集 类似于unicode,GB2312,GBK,ASCII等等.因为一开始只有26个英文字母需要 编一下号.所有用下 ...

  5. 遇见JMS[1] —— activeMQ的简单使用

    1.JMS Java Message Service,提供API,供两个应用程序或者分布式应用之间异步通信,以传送消息. 2.相关概念 提供者:实现JMS规范的消息中间件服务器客户端:发送或接收消息的 ...

  6. HTTP协议报文结构及示例

    HTTP基本架构 下面我们用一张简单的流程图来展示HTTP协议基本架构,以便大家先有个基本的了解. 9.png Web Client可以是浏览器.搜索引擎.机器人等等一切基于HTTP协议发起http请 ...

  7. Service IP 原理 - 每天5分钟玩转 Docker 容器技术(137)

    Service Cluster IP 是一个虚拟 IP,是由 Kubernetes 节点上的 iptables 规则管理的. 可以通过 iptables-save 命令打印出当前节点的 iptable ...

  8. Spark源码编译(未完待续)

    在这里我们不需要搭建独立的Spark集群,利用Yarn Client调用Hadoop集群的计算资源. Spark源码编译生成配置包: 解压源码,在根去根目录下执行以下命令(sbt编译我没尝试) ./m ...

  9. cips2016+学习笔记︱NLP中的消岐方法总结(词典、有监督、半监督)

    歧义问题方面,笔者一直比较关注利用词向量解决歧义问题: 也许你寄希望于一个词向量能捕获所有的语义信息(例如run即是动车也是名词),但是什么样的词向量都不能很好地进行凸显. 这篇论文有一些利用词向量的 ...

  10. GNU C 扩展之__attribute__ 机制简介

    在学习linux内核代码及一些开源软件的源码(如:DirectFB),经常可以看到有关__attribute__的相关使用.本文结合自己的学习经历,较为详细的介绍了__attribute__相关语法及 ...