母版(Layout)和用户控件(部分视图)在任何一个成熟的UI表现框架上是少不了的特性了,如果没有这两个特性,复制粘贴的工作就少不了了。
在了解到Nancy的时候,我同样是迫不及待的想看看是否支持个两个特性。
根据Nancy官方文档知道,Nancy支持几个模板引擎,其中就有Razor,这对ASP.NET MVC的程序员来说是个福音,我肯定是选择Razor的。
Nancy的Razor和MVC的Razor大部分语法是一样的,有些地方可能没Razor灵活和强大,毕竟VS IDE、ASP.NET MVC框架和C#语言都是人家自家的东西。
要使用Nancy的Razor引擎,除了引用Nancy和Nancy.Hosting.Self包,还需添加Nancy.Viewengines.Razor,而Nancy.Viewengines.Razor依赖于Microsoft.AspNet.Razor,所以项目的packages.config看起来是这样的:
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net45" /> <package id="Nancy" version="1.2.0" targetFramework="net45" /> <package id="Nancy.Hosting.Self" version="1.2.0" targetFramework="net45" /> <package id="Nancy.Viewengines.Razor" version="1.2.0" targetFramework="net45" /> </packages>
注:Nancy.Hosting.Self不是必须的,我用的自宿主,所以用这个,还可以宿主在ASP.NET,WCF等等。
添加了Nancy.Viewengines.Razor后,项目会修改app.config,另外会添加一个web.config,里面有Razor的一些配置。
先来看一些项目的文件结构,再简单说明部分文件里的内容:
第一步,Views根目录的_ViewStart.cshtml,Nancy.Razor也是支持的,在这里可以指定默认的Layout
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic> @{ Layout = "/Shared/_Layout.cshtml"; }第二步,_Layout也没什么特别的,那MVC里的差不多,不过有一点要注意,如果是最顶级母版,必须设置Layout=null;
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic> @{ Layout = null;//这里一定要设置 } <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title></title> </head> <body> <div style="border:2px solid #ffd800"> @RenderBody() </div> @Html.Partial("/Shared/Footer") @RenderSection("scripts",false) </body> </html>
这里有熟悉的@RenderBody,@RenderSection,@Html.Partial,都是可用的。
第三步,home/index.cshtml和home/about.cshtml就可以使用_Layout.cshtml了,下面是about.cshtml
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<NancyAPI.Person> <h2>About Page</h2> <p>ID:@Model.ID</p> <p>ID:@Model.Name</p>对应的路由如下:
Get["/about"] = parameter => { Person p = new Person() { ID = 26, Name = "loogn" }; return View["home/about", p]; };