我们在ASP.NET MVC中可以返回各种类型的ActionResult(以下图片来自于园友--待补。。)

在Nancy 中本着简单粗暴的原则,使用方式略有不同。这期我们使用的版本是Nancy的第一个tag version 0.0.2.0。

public MainModule(IRouteCacheProvider routeCacheProvider)
{
Get["/"] = x => {
return View.Razor("~/views/routes.cshtml", routeCacheProvider.GetCache());
}; // TODO - implement filtering at the RouteDictionary GetRoute level
Get["/filtered", r => true] = x => {
return "This is a route with a filter that always returns true.";
}; Get["/filtered", r => false] = x => {
return "This is also a route, but filtered out so should never be hit.";
}; Get["/test"] = x => {
return "Test";
}; Get["/static"] = x => {
return View.Static("~/views/static.htm");
}; Get["/razor"] = x => {
var model = new RatPack { FirstName = "Frank" };
return View.Razor("~/views/razor.cshtml", model);
}; Get["/ndjango"] = x => {
var model = new RatPack { FirstName = "Michael" };
return View.Django("~/views/ndjango.django", model);
}; Get["/spark"] = x => {
var model = new RatPack { FirstName = "Bright" };
return View.Spark("~/views/spark.spark", model);
}; Get["/json"] = x => {
var model = new RatPack { FirstName = "Andy" };
return Response.AsJson(model);
}; Get["/xml"] = x => {
var model = new RatPack { FirstName = "Andy" };
return Response.AsXml(model);
};
}

这里我们看到所有类型的返回还是储存在RouteDictionary中,依次为返回Razor View,string,static file,Django View,Spark View,Json,Xml......实际上也是用了一个ViewResult的类,因为只是执行不同的Action,所以只需要一个类表示。

public class ViewResult
{
public ViewResult(IView view, string location)
{
this.View = view;
this.Location = location;
} public string Location { get; private set; } public IView View { get; private set; } public void Execute(Stream stream)
{
// The caller needs to close the stream.
var writer = new StreamWriter(stream);
View.Writer = writer;
View.Execute();
writer.Flush();
}

先从居家旅游必备的返回静态文件的例子开始:

public static Action<Stream> Static(this IViewEngine engine, string virtualPath)
{
return stream => { var path = HostingEnvironment.MapPath(virtualPath); using (var reader = new StreamReader(path))
{
using(var writer = new StreamWriter(stream))
{
writer.Write(reader.ReadToEnd());
writer.Flush();
}
} };
},

可以看到这里采用的是扩展IViewEngine,返回的是一个对Stream的Action。比较简单就不展开细说了。

对于xml 和 json 的返回值处理方法类似,这里就合并在一起作了类似的处理。

public static class FormatterExtensions
{
public static Response AsJson<TModel>(this IResponseFormatter formatter, TModel model)
{
return new JsonResponse<TModel>(model);
} public static Response AsXml<TModel>(this IResponseFormatter formatter, TModel model)
{
return new XmlResponse<TModel>(model);
} public static Response Image(this IResponseFormatter formatter, string imagePath)
{
return new ImageResponse(imagePath);
}
}

Nancy支持的ViewEngine很多,以Razor为例来看。

	public MainModule(IRouteCacheProvider routeCacheProvider)
{
Get["/"] = x => {
return View.Razor("~/views/routes.cshtml", routeCacheProvider.GetCache());
};
}

这里的路径是"~/views/routes.cshtml",首先找到实际的磁盘路径:

public ViewLocationResult GetTemplateContents(string viewTemplate)
{
var path = HostingEnvironment.MapPath(viewTemplate);
return new ViewLocationResult(path, new StreamReader(path));
}

这里的返回值是该文件的一个StreamReader,然后传递给我们的View Compiler。

var result = ViewTemplateLocator.GetTemplateContents(viewTemplate);
var view = ViewCompiler.GetCompiledView<TModel>(result.Contents);RazorEngine和CodeDom。

这里结合使用了RazorEngine和CodeDom,这两个东西本身比较大,这里只是告诉大家有这么个东西,能够做什么。RazorEngine开源项目地址:https://github.com/Antaris/RazorEngine

举个简单的例子:

string template = "Hello @Model.Name, welcome to RazorEngine!";
var result =
Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" });

CodeDomProvider用来生成中间代码。CodeDom是.NET 的一项依据模板生成代码的技术,这方面园友有不少文章(比如说这个:http://www.cnblogs.com/whitewolf/archive/2010/06/19/1760708.html)。 可以看到生成的临时文件内容如下,最终会编译并执行最终输出我们需要的stream。

这里面生成的代码执行的是我们的RazorViewBase里面的方法。

最终我们Execute结束将结果输出到Response流中,看到了呈现的html。

起点还是我们的ProcessRequest,中间的过程不多。

当当当当 - つづく

.NET Nancy 详解(三) Respone 和 ViewEngine的更多相关文章

  1. .NET DLL 保护措施详解(三)最终效果

    针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...

  2. Android 之窗口小部件详解(三)  部分转载

    原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...

  3. WebSocket安卓客户端实现详解(三)–服务端主动通知

    WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 We ...

  4. logback -- 配置详解 -- 三 -- <encoder>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  5. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  6. Python操作redis字符串(String)详解 (三)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...

  7. pika详解(三)SelectConnection及其他Connection

    pika详解(三)SelectConnection及其他Connection   本文链接:https://blog.csdn.net/comprel/article/details/94661147 ...

  8. View绘制详解(三),扒一扒View的测量过程

    所有东西都是难者不会,会者不难,Android开发中有很多小伙伴觉得自定义View和事件分发或者Binder机制等是难点,其实不然,如果静下心来花点时间把这几个技术点都研究一遍,你会发现其实这些东西都 ...

  9. Android WebView 开发详解(三)

    转载请注明出处   http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao 概览 Android ...

随机推荐

  1. OAuth 2.0 授权原理

    出处:http://www.cnblogs.com/neutra/archive/2012/07/26/2609300.html 最近在做第三方接入的,初步定下使用OAuth2协议,花了些时间对OAu ...

  2. Kali Linux渗透测试实战 1.2 环境安装及初始化

    1.2 环境安装及初始化 目录(?)[-] 环境安装及初始化 下载映像 安装虚拟机 安装Kali Linux 安装中文输入法 安装VirtualBox增强工具 配置共享目录和剪贴板 运行 Metasp ...

  3. 修改nw.js的exe文件使其请求管理员权限

    修改nw.js的exe文件使其请求管理员权限 默认情况下,nw.js发布的nw.exe文件请求的是普通权限,当我们的应用需要访问一些特殊目录或者注册表等,就需要程序启动的时候以管理员权限运行.那么此时 ...

  4. 目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?以及Github的注册过程

    一.目前流行的源程序版本管理软件和项目管理软件有Microsoft TFS.GitHub.SVN.Coding等. 二.各有什么优缺点 三.在GitHub注册账户的过程 Microsoft TFS的优 ...

  5. Handlebars.js循环中索引(@index)使用技巧(访问父级索引)

    使用Handlebars.js过程中,难免会使用循环,比如构造数据表格.而使用循环,又经常会用到索引,也就是获取当前循环到第几次了,一般会以这个为序号显示在页面上. Handlebars.js中获取循 ...

  6. 获取IOS应用的子目录

    在开发IOS应用时,我们经常需要将素材分类,并放入相应地子目录中. 在开发代码时,需要访问这些素材时,就需要获取对应的子目录路径.那么如何获取呢? 获取应用路径 首先,要找到应用所在的路径. NSSt ...

  7. Open Source Cassandra Gitbook for Developer

    Just released an open source Cassandra Gitbook for developer. http://teddymaef.github.io/learncassan ...

  8. 好脑袋不如烂笔头-Quartz使用总结

    Quartz是Java平台的一个开源的作业调度框架.Quartz.net是从java版本移植到.net版本的..net项目使用Quartz来执行批处理等定时任务非常方便. (1)从nuget上可以安装 ...

  9. 移动端使用localResizeIMG4压缩图片

    移动h5开发避免不了上传图片,一般我们使用html自带的控件input或者使用微信上传API.但微信上传API不是任何地方都可以使用的,使用html自带的控件input上传又免不了图片体积太大,上传不 ...

  10. Java面试(1)-- Java赋值表达式

    1 class Demo01{ 2 public static void main(String[] args){ 3 //赋值运算符 = 4 5 //例1 6 int a = 1; 7 System ...