Nancy in .Net Core学习笔记 - 视图引擎
前文中我們介紹了Nancy中的路由,這一篇我們來介紹一下Nancy中的視圖引擎。
Nancy中如何返回一個視圖(View)
在ASP.NET Mvc中,我們使用ViewResult類來返回一個視圖。Nancy中也提供了類似的功能, 在NancyModule類中,Nancy提供了一個ViewRenderer類型的View的屬性來返回視圖。
ViewRenderer類代碼如下,該類中提供了三個屬性訪問器
public class ViewRenderer : IHideObjectMembers{public ViewRenderer(INancyModule module);public Negotiator this[[Dynamic] dynamic model] { get; }public Negotiator this[string viewName] { get; }public Negotiator this[string viewName, [Dynamic] dynamic model] { get; }}public Negotiator this[string viewName] - 僅指定呈現的數據模型, Nancy會根據url自動匹配一個View文件
public Negotiator this[string viewName] - 僅指定返回的View文件名
public Negotiator this[string viewName, [Dynamic] dynamic model] - 不僅指定的View的文件名,還指定了用于呈現的數據模型
下面我們修改之前的HelloModule.cs, 添加一個/hello的路由模板, 并使用View屬性來返回一個視圖
public class HelloModule : NancyModule{public HelloModule(){Get("/hello", p => View["hello.html"]);}}然后我們創建一個wwwroot目錄,并在其中添加一個hello.html, 里面的代碼如下
<h1>Hello World</h1>現在我們啟動項目, 并輸入/hello, 瀏覽器返回的結果如下。
不要慌張,這說明我們的請求被Nancy處理了,只是因為在服務器上沒有正確找到hello.html這個文件,所以報錯了,繼續看完下一節的內容,你的頁面就能正確顯示。
Nancy中的視圖位置約定
Nancy中官網文檔中介紹了好幾種視圖的位置約定,它定義了Nancy中搜索視圖文件的順序和方式。
我們用以下代碼為例
public class HelloModule : NancyModule{public HelloModule(){Get("/hello", p => View["hello.html"]);}}當/hello請求進入Nancy管道后,我們決定使用hello.html作為響應頁面,當Nancy嘗試尋找這個頁面時,
- Nancy首先會去尋找網站根目錄下"/views/[模塊名]/[指定頁面文件名]", 如果找的到該文件,Nancy即讀取該頁面內容,并綁定數據模型返回給客戶端,這就是View and Module Name約定。在當前例子中即/views/Hello/hello.html
- 如果找不到文件,Nancy會繼續尋找網站根目錄下"/[模塊名]/[指定頁面文件名]", 這就是Module Name約定。當前例子中即/Hello/hello.html
- 如果還是找不到文件,Nancy會繼續尋找網站根目錄下"/views/[指定頁面文件名]", 這就是View Folder Name約定。當前例子中即/views/hello.html
- 如果還是找不到文件,Nancy最終會去尋找網站根目錄下"/[指定頁面文件名]",這就是Root約定。當前例子中即/hello.html
- 如果都找不到, Nancy會返回一個錯誤頁
切換網站根目錄
在.NET Core中我們通常會將靜態文件方式在wwwroot目錄中, 而非網站根目錄 這樣會導致Nancy不能正確訪問到正確的靜態文件。這里我們就需要去修改Nancy默認的網站根目錄設置。
Nancy我們可以通過實現IRootPathProvider接口的GetRootPath方法, 并覆蓋DefaultNancyBootstrapper類中的RootPathProvider屬性來實現自定義網站根目錄。
首先我們創建一個新類CustomRootPathProvider。
public class CustomRootPathProvider : IRootPathProvider{public string GetRootPath(){return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot");}}代碼中通過拼接目錄, 我們將當前網站的根目錄指向了wwwroot。
然后我們創建一個新類CustomBootstrapper, 讓它繼承NancyDefaultBootstrapper類并使用CustomerRootPathProvider作為Nancy的RootPathProvider。
public class CustomBootstrapper : DefaultNancyBootstrapper{protected override IRootPathProvider RootPathProvider{get{return new CustomRootPathProvider();}}}特別注意:當創建自定義Bootstrapper之后,之前的Nancy的Trace功能會被屏蔽掉,如果想重新啟用Trace功能,需要在CustomBootstrapper中加入如下代碼。
public override void Configure(INancyEnvironment environment){environment.Tracing(enabled: true, displayErrorTraces: true);base.Configure(environment);}現在我們重啟項目, 輸入/hello, 頁面正確顯示了。
Nancy中支持的視圖引擎
Nancy中支持的視圖引擎如下
- Super Simple View Engine(SSVE)
- Razor
- Spark
- NDjango
- dotLiquid
這里我們重點說明一下SSVE。
超級簡單的視圖引擎(Super Simple View Engine)
Super Simple View Engine, 簡稱SSVE, 是Nancy默認提供的視圖引擎, 我們前面的例子使用的就是SSVE視圖引擎。
下面我們介紹一個SSVE視圖引擎的一些基本語法
輸入變量的值
語法:
@Model[.Parameters]例:
BookModule.cs
public class BookModule : NancyModule{public BookModule(){Get("/books/{bookId}", p => View["book.html", new { BookId = p.bookId }]);}}book.html
The Book Id is @Model.BookId迭代
語法:
@Each[.Parameters] [@Current[.Parameters]] @EndEach例:
BookModule.cs
books.html
<table><tr>ISBN</tr><tr>Book Name</tr><tbody>@Each.Books<tr><td>@Current.ISBN</td><td>@Current.BookName</td></tr>@EndEach</tbody> </table>條件
語法
@If[Not].Parameters [contents] @EndIf注意:這里只支持bool類型的變量,不支持表達式
例:
BookModule.cs
booksWithIf.html
<table><tr>ISBN</tr><tr>Book Name</tr><tbody>@Each.Books@If.IsNew<tr><td>@Current.ISBN</td><td>@Current.BookName</td></tr>@EndIf@EndEach</tbody> </table>輸出Partial View
語法
@Partial['<view name>'[, Model.Property]]例:
BookModule.cs
public class BookModule : NancyModule{public BookModule(){Get("/books/{bookId}", p => View["bookWithPartial.html", new { BookId = p.bookId }]);}}partial.html
<h1>Hello Nancy</h1>bookWithParital.html
The Book Id is @Model.BookId@Partial['partial.html']模板頁
語法:
@Master['<name>']@Section['<name>'] @EndSection例:
BookModule.cs
bookWithMaster.html
@Master['master.html']@Section['content'] The Book Id is @Model.BookId @EndSectionmaster.html
<h1>This is just an example</h1><div style="border:1px solid #000;width:200px;">@Section['Content']; </div>Razor
SSVE視圖引擎雖然很簡單,但是提供的方法不多,應對許多復雜場景,都需要去自定義語法模板。
除了SSVE, Nancy中還可以使用和ASP.NET Mvc中一樣的Razor視圖引擎, 其中的語法和使用方式與ASP.NET Mvc中的Razor引擎基本一樣。但是需要注意的是Nancy.Viewengines.Razor還沒有完成針對.NET Stardard重寫,所以如果想在Nancy中使用Razor引擎的同學只能在非.NET Core項目中使用它, 相關的教程請參見官網
總結
Nancy的視圖引擎自2016.12月之后就沒有再發布了, 個人感覺Nancy現在發展的重點已經不再視圖引擎上了, Nancy更多的作為WebApi來使用,最近有發現一本書,介紹了Nancy的微服務實踐,有興趣的同學可以一起讀一下。
Microservices in .NET Core with Examples in Nancy
本篇博客源代碼
下一篇我們一起來學習Nancy中的數據模型綁定。
轉載于:https://www.cnblogs.com/lwqlun/p/9629185.html
總結
以上是生活随笔為你收集整理的Nancy in .Net Core学习笔记 - 视图引擎的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软考-高项
- 下一篇: [WPF 基础知识系列] —— 绑定中的