.NET Nancy 详解(三) Respone 和 ViewEngine
我们在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的更多相关文章
- .NET DLL 保护措施详解(三)最终效果
针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...
- Android 之窗口小部件详解(三) 部分转载
原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...
- WebSocket安卓客户端实现详解(三)–服务端主动通知
WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 We ...
- logback -- 配置详解 -- 三 -- <encoder>
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
- Python操作redis字符串(String)详解 (三)
# -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...
- pika详解(三)SelectConnection及其他Connection
pika详解(三)SelectConnection及其他Connection 本文链接:https://blog.csdn.net/comprel/article/details/94661147 ...
- View绘制详解(三),扒一扒View的测量过程
所有东西都是难者不会,会者不难,Android开发中有很多小伙伴觉得自定义View和事件分发或者Binder机制等是难点,其实不然,如果静下心来花点时间把这几个技术点都研究一遍,你会发现其实这些东西都 ...
- Android WebView 开发详解(三)
转载请注明出处 http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao 概览 Android ...
随机推荐
- 【Bugly安卓开发干货分享】Android APP 快速 Pad 化实现
项目背景 采用最新版本手机 APP(之后称为 MyApp)代码,实现其 Pad 化,为平板和大屏手机用户提供更好的体验.为实现 MyApp 的 Pad 化工作,需要我们首先来了解一下 MyApp 项目 ...
- Java提高篇(二七)-----TreeMap
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...
- ubuntu 13.04下MYSQL 5.5环境搭建
解决的问题: 安装mysql server和mysql client 5.5 新建远程账户 远程访问权限 MYSQL默认字符集修改为UTF8 检查防火墙 一.安装 BTW:可以使用查找命令查看安装包 ...
- C#将dll打包到程序中
最近比较懒,加上内容也不多就懒得排版了,字放大了,看起来应该方便一点 直接进入主题 先来看一个栗子,假设现在有一个第三方dll namespace TestLibrary1 { public clas ...
- 12小时包你学会基于ReactMix框架的ReactNativeApp开发(二)基于Css+HTML写第一个app页面
上一篇文章,大家对于ReactMix(https://github.com/xueduany/react-mix)框架有了一个基本认识,知道我们是一个语法糖,帮助大家基于一套代码,所有平台都能跑.那么 ...
- 我也说百度和google
对于程序员,最好的老师恐怕还是百度或者google或一些专业的it社区.网站了罢! 之前曾听到这样的一句话, 文艺程序员用Google Scholar/Scirus/stackoverflow.普通程 ...
- java.sql.SQLException: JZ00L
出现, java.sql.SQLException: JZ00L: 登录失败.检查与此异常现象有关的 SQL 警告以获得失败原因. at com.sybase.jdbc3.jdbc.ErrorMess ...
- Java连接Oracle数据库开发银行管理系统【二、设计篇】
一.总体分析 此系统的实现并不难,但是如何更好的设计出实现方式还是需要更深入的分析,例如:如果再增加其他功能,是不是需要变动的 代码很少,只是直接再增加一点功能就可以了呢?如果使用的不是Ora ...
- 《Effective Java》—— 对于所有对象都通用的方法
本节主要涉及Object中通用的一些方法,比如equals,hashCode,toString,clone,finalize等等 覆盖equals时请遵守通用约定 equals方法实现的等价关系: 自 ...
- Jenkins的系统设置
1.登录Jenkins进入以下界面: 2.点击 系统管理 3.点击 系统设置 (下图的系统设置是已经设置好的) 4.这里设置主要设置 Jenkins URL (这里我是测试的所以使用默认的)与 邮件的 ...