母版(Layout)和用戶控件(部分視圖)在任何一個成熟的UI表現框架上是少不了的特性了,若是沒有這兩個特性,複製粘貼的工做就少不了了。 html
在瞭解到Nancy的時候,我一樣是火燒眉毛的想看看是否支持個兩個特性。 程序員
根據Nancy官方文檔知道,Nancy支持幾個模板引擎,其中就有Razor,這對ASP.NET MVC的程序員來講是個福音,我確定是選擇Razor的。 web
Nancy的Razor和MVC的Razor大部分語法是同樣的,有些地方可能沒Razor靈活和強大,畢竟VS IDE、ASP.NET MVC框架和C#語言都是人家自家的東西。 c#
要使用Nancy的Razor引擎,除了引用Nancy和Nancy.Hosting.Self包,還需添加Nancy.Viewengines.Razor,而Nancy.Viewengines.Razor依賴於Microsoft.AspNet.Razor,因此項目的packages.config看起來是這樣的: app
<?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的一些配置。 spa
先來看一些項目的文件結構,再簡單說明部分文件裏的內容: code
第一步,Views根目錄的_ViewStart.cshtml,Nancy.Razor也是支持的,在這裏能夠指定默認的Layout xml
@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,都是可用的。 htm
第三步,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]; };