.NET Nancy 详解(三) Respone 和 ViewEngine

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

2011062820404494.png

在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 levelGet["/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。

161453-20151107122918336-1876204220.png

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

161453-20151107124651149-1730555733.png

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

161453-20151107124007961-826109630.png

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

161453-20151107125343930-353102980.png

当当当当 - つづく

转载于:https://www.cnblogs.com/bnbqian/p/4944829.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript中Date对象的初始化方法

为什么80%的码农都做不了架构师&#xff1f;>>> 在前端代码中难免会涉及到时间的操作&#xff0c;如何构造一个Date对象呢&#xff1f;javascript为我们提供如下几种方式&#xff1a; new Date("month dd,yyyy hh:mm:ss");new Date("month dd,yyyy&…

java id主键_JAVA主键ID生成工具类:改自twitter的分布式ID算法snowflake

祝大家新年快乐&#xff0c;有任何问题可与我联系&#xff1a;关于snowflake算法的介绍和原理这里不过多说明了&#xff0c;网上有很多。这里简单描述下SnowflakeUtil的优点&#xff1a;1、做为底层工具使用&#xff0c;可用于数据库主键、订单编号……2、不依赖数据库&#xf…

云上“炼”码兵器 GitHub Codespaces

GitHub 是全球最受欢迎的开发者平台&#xff0c; ⾃从微软收购了 GitHub 后&#xff0c; GitHub 的功能就越来越强⼤&#xff0c;除了原有的代码管理外&#xff0c;也增加了很多硬货&#xff0c;这就包括了集成 CI/CD 的 GitHub Actions &#xff0c;以及完善的项⽬管理功能&am…

python 中的yum pip

为什么80%的码农都做不了架构师&#xff1f;>>> python 中的yum pip pip 可以管理python中的模块&#xff0c;之于python就像yum之于redhat 转载于:https://my.oschina.net/sskxyz/blog/368099

ArcGIS怎样获取重分类后各类所占的像元个数

【问题描述】如下图所示,给西北地区2007年平均NDVI分等级,求各个等级的面积所占百分比? 解决方法: 刚开始老在如下图所示的Properties界面中进行重分类,虽然能得到分类结果,但是却得不到像元个数,因为是连续的,也不会有属性表生成: 后来发现,工具箱中还有个分类工具…

13.ThreadPoolExecutor线程池之submit方法

jdk1.7.0_79 在上一篇《ThreadPoolExecutor线程池原理及其execute方法》中提到了线程池ThreadPoolExecutor的原理以及它的execute方法。本文解析ThreadPoolExecutor#submit。 对于一个任务的执行有时我们不需要它返回结果&#xff0c;但是有我们需要它的返回执行结果。对于线程…

java idea 模块_idea 多模块项目依赖父工程class找不到问题的方法

比如&#xff0c;我们有这么个过程&#xff0c;项目结构如下&#xff1a;a--b--ca是总结点&#xff0c;b是子节点&#xff0c;c是父节点b依赖父节点class&#xff0c;通过maven构建时通常我们会在子节点中添加父节点依赖&#xff0c;如&#xff1a;com.xxxc${project.version}虽…

关于OAuth2.0 Authorization Code+PKCE flow在原生客户端(Native App)下集成的思考

Working with Proof Key for Code Exchange (PKCE) - DEV Community写在前面前几天看了园友的一篇文章被广泛使用的OAuth2.0的密码模式已经废了&#xff0c;放弃吧 被再次提起&#xff1a;Implicit Flow Password Grant&#xff0c;均已被标记为Legacy&#xff0c;且OAuth2.1里…

【经典回放】多种语言系列数据结构算法:希尔排序(C/C#版)

原理&#xff1a;每隔sp&#xff08;整数&#xff09;个数即取数并判断大小&#xff0c;交换&#xff0c;先构造局部有序序列&#xff0c;直到sp为1&#xff0c;构造完整的有序序列。 给出一组数据&#xff0c;如下&#xff1a; 0 1 2 3 4 5 6 7 8 9 49 38 65 97 …

【131天】尚学堂高淇Java300集视频精华笔记(65-66)

第65集&#xff1a;常用类Date类的使用JDk源码分析 Date时间类&#xff08;java.util.Date&#xff09; 在标准Java类库中包含一个Date类。它的对象表示一个特定的瞬间&#xff0c;精确到毫秒。 Date()分配一个Date对象&#xff0c;并初始化此对象为当前的日期和时间精确到毫秒…

ArcGIS 10.2加载在线影像底图

两种方法&#xff1a; 一、File→ArcGIS Online→影像图→Open。 二、 效果&#xff1a;

都说不要装箱,那装箱到底带来了什么开销?

相信很有朋友在面试时大多会被问到 装箱 的问题&#xff0c;也是一个经典的问题&#xff0c;可深可浅&#xff0c;那今天我们就从 汇编 和 内存 角度进行统一解读下。为了方便演示&#xff0c;先上一段装箱的代码。class Program{static void Main(string[] args){var i 10;va…

Java中方法的继承以及父类未被子类覆盖的方法调用的问题

在看java继承这一块的时候发现了一个问题&#xff0c;即父类未被子类覆盖的方法是如何调用的&#xff1f; 是子类拥有了父类的该方法只是没有显示表示&#xff0c;还是子类调用了父类的该方法。 为此做了一下验证 代码如下&#xff1a; public class One {protected void print…

Excel VBA编程基础

一、程序基本调试方法 1、VB程序的三种状态:设计时、运行时和中断模式。 2、但不执行代码,快捷键为F8。 3、中断程序的方法: (1)使用断点 (2)使用Debug.Assert (3)使用监视条件 二、Excel Shape对象

分治算法之合并排序

1、问题 合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列 2、思路 1、分解:将待排序元素分成大小大致相同的两个子序列 2、治理:对两个子序列进行合并排序 3、…

WPF 实现截屏控件之移动(二)(仿微信)

WPF开发者QQ群此群已满340500857 &#xff0c;请加新群458041663由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 接着上一篇&#xff0c;兼容屏幕缩放问题。01—代码如下一、创建ScreenCut.xaml代码如下。<ResourceDictiona…

深入剖析阿里云推荐引擎——新架构,新体验

摘要&#xff1a;本文的整理自2017云栖大会-上海峰会上阿里云算法专家郑重&#xff08;卢梭&#xff09;的分享讲义&#xff0c;从2016年2月V2.0公开使用到现在&#xff0c;阿里云推荐引擎有了更大的进步。有着获取排序的在线计算&#xff0c;修正匹配的近线计算及匹配排序的离…

分治算法之快速排序

1、快速排序 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序 2、思路 ( 1 )分解:先从数列中取出一个元素作为基准元素。以基准元素为标准,将问题分解为两个子序列,使小于…

SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型

SQL Server 2008空间数据应用系列三&#xff1a;SQL Server 2008空间数据类型 原文:SQL Server 2008空间数据应用系列三&#xff1a;SQL Server 2008空间数据类型友情提示&#xff0c;您阅读本篇博文的先决条件如下&#xff1a; 1、本文示例基于Microsoft SQL Server 2008 R2调…

.NET 很好,你可能对它有一些误解

> 作者&#xff1a;Charles Chen在 20 年前的 2002 年, 微软公布了下一代的软件、服务的愿景和路线&#xff0c;2 月 13 日&#xff0c;Visual Studio .NET 推出&#xff0c;.NET 开发平台的第一个版本正式向世界发布。到现在为止&#xff0c;.NET 都已经 20 岁了, 它已经成…