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, 瀏覽器返回的結果如下。
65831-20180911173607568-49757408.png

不要慌張,這說明我們的請求被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, 頁面正確顯示了。

65831-20180911173623143-953468064.png

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

65831-20180911173636327-1915777780.png

迭代

語法:

@Each[.Parameters]  [@Current[.Parameters]]  
@EndEach

例:
BookModule.cs

    public class BookModule : NancyModule{public BookModule(){Get("/books", p =>{return View["books.html", new{Books = new List<Book> {new Book("S001", "Math 101"),new Book("T001", "C# Programming")}}];});}}public class Book{public Book(string isbn, string bookName){ISBN = isbn;BookName = bookName;}public string ISBN { get; set; }public string BookName { get; set; }}

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>

65831-20180911173647406-718249129.png

條件

語法

@If[Not].Parameters   [contents]   
@EndIf

注意:這里只支持bool類型的變量,不支持表達式

例:
BookModule.cs

    public class BookModule : NancyModule{public BookModule(){Get("/books", p =>{return View["booksWithIf.html", new{Books = new List<Book> {new Book("S001", "Math 101", true),new Book("T001", "C# Programming", false)}}];});}}public class Book{public Book(string isbn, string bookName, bool isNew){ISBN = isbn;BookName = bookName;IsNew = isNew;}public string ISBN { get; set; }public string BookName { get; set; }public bool IsNew { get; set; }}

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>

65831-20180911173657317-1627160990.png

輸出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']

65831-20180911173727890-1296829744.png

模板頁

語法:

@Master['<name>']@Section['<name>']
@EndSection

例:
BookModule.cs

public class BookModule : NancyModule{public BookModule(){Get("/books/{bookId}", p => View["bookWithMaster.html", new { BookId = p.bookId }]);}}

bookWithMaster.html

@Master['master.html']@Section['content']
The Book Id is @Model.BookId
@EndSection

master.html

<h1>This is just an example</h1><div style="border:1px solid #000;width:200px;">@Section['Content'];
</div>

65831-20180911173744112-1442608578.png

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249535.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249535.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249535.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式之組合模式(Composite 模式)

引入composite模式 在計算機文件系統中&#xff0c;有文件夾的概念&#xff0c;文件夾里面既可以放入文件也可以放入文件夾&#xff0c;但是文件中卻不能放入任何東西。文件夾和文件構成了一種遞歸結構和容器結構。 雖然文件夾和文件是不同的對象&#xff0c;但是他們都可以被放…

Ansible批量在遠程主機執行命令

Ansible直接執行遠程命令&#xff0c;不用ssh登陸交互執行。    如下&#xff1a;    ansible all -i 192.168.199.180, -m shell -a "ifconfig" -u supermap    參數解釋&#xff1a;    -i 連接到遠程主機“192.168.199.180&#xff0c;”&#xf…

HOJ 2651

一道二分的題目&#xff0c;但要注意不能用double&#xff0c; 并且要注意一下二分的步驟 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define pi 3.1415926535898 #define eps 0.0001 using namespace std; inl…

HierarchicalBeanFactory接口

HierarchicalBeanFactory 提供父容器的訪問功能.至于父容器的設置,需要找ConfigurableBeanFactory的setParentBeanFactory(接口把設置跟獲取給拆開了!). HierarchicalBeanFactory源碼具體&#xff1a; 1、第一個方法返回本Bean工廠的父工廠。這個方法實現了工廠的分層。 2、第…

C++: C++函數聲明的時候后面加const

C: C函數聲明的時候后面加const 轉自&#xff1a;http://blog.csdn.net/zhangss415/article/details/7998123 非靜態成員函數后面加const&#xff08;加到非成員函數或靜態成員后面會產生編譯錯誤&#xff09;&#xff0c;表示成員函數隱含傳入的this指針為const指針&#xff0…

【計蒜客習題】消除字符串

問題描述 蒜頭君喜歡中心對稱的字符串&#xff0c;即回文字符串。現在蒜頭君手里有一個字符串 SS&#xff0c;蒜頭君每次都會進行這樣的操作&#xff1a;從 SS 中挑選一個回文的子序列&#xff0c;將其從字符串 SS 中去除&#xff0c;剩下的字符重組成新的字符串 SS。 蒜頭君想…

HierarchicalBeanFactory

BeanFactory分層 package org.springframework.beans.factory;//分層工廠 public interface HierarchicalBeanFactory extends BeanFactory {//返回工廠的父工廠BeanFactory getParentBeanFactory();//這個工廠中是否包含這個Beanboolean containsLocalBean(String name); }測…

Training a classifier

你已經學習了如何定義神經網絡&#xff0c;計算損失和執行網絡權重的更新。 現在你或許在思考。 What about data? 通常當你需要處理圖像&#xff0c;文本&#xff0c;音頻&#xff0c;視頻數據&#xff0c;你能夠使用標準的python包將數據加載進numpy數組。之后你能夠轉換這些…

19歲白帽子通過bug懸賞賺到一百萬美元--轉

出處&#xff1a;https://news.cnblogs.com/n/620858/ 19 歲的 Santiago Lopez 通過 bug 懸賞平臺 HackerOne 報告漏洞&#xff0c;成為第一位通過 bug 懸賞賺到一百萬美元的白帽子黑客。他的白帽子生涯始于 2015 年&#xff0c;至今共報告了超過 1600 個安全漏洞。他在 16 歲時…

代碼分層的設計

分層思想&#xff0c;是應用系統最常見的一種架構模式&#xff0c;我們會將系統橫向切割&#xff0c;根據業務職責劃分。MVC 三層架構就是非常典型架構模式&#xff0c;劃分的目的是規劃軟件系統的邏輯結構便于開發維護。MVC&#xff1a;英文即 Model-View-Controller&#xff…

【24小時內第四更】為什么我們要堅持寫博客?

前言 從2018年7月份&#xff0c;我開始了寫作博客之路。開始之前&#xff0c;我打算分享下之前的經歷。去年初公司來了個架構師&#xff0c;內部分享過docker原理&#xff0c;TDD單元測試驅動&#xff0c;并發并行異步編程等內容&#xff0c;讓我著實驚呆了&#xff0c;因為確實…

sqoop快速入門

轉自http://www.aboutyun.com/thread-22549-1-1.html 轉載于:https://www.cnblogs.com/drjava/p/10473297.html

ListableBeanFactory接口

ListableBeanFactory獲取bean時,Spring 鼓勵使用這個接口定義的api. 還有個Beanfactory方便使用.其他的4個接口都是不鼓勵使用的. 提供容器中bean迭代的功能,不再需要一個個bean地查找.比如可以一次獲取全部的bean(太暴力了),根據類型獲取bean.在看SpringMVC時,掃描包路徑下的…

HDU 4035 Maze

Maze http://acm.hdu.edu.cn/showproblem.php?pid4035 分析&#xff1a; 在樹上走來走去&#xff0c;然后在一個點可以k的概率回到1&#xff0c;可以e的概率走出去&#xff0c;可以1-k-e的概率走到其他的位置&#xff08;分為父節點和子節點討論&#xff09;。 轉移方程就是&a…

面向對象之三大特性:繼承,封裝,多態

python面向對象的三大特性&#xff1a;繼承&#xff0c;封裝&#xff0c;多態。 1. 封裝: 把很多數據封裝到?個對象中. 把固定功能的代碼封裝到?個代碼塊, 函數, 對象, 打包成模塊. 這都屬于封裝的思想. 具體的情況具體分析. 比如. 你寫了?個很?B的函數. 那這個也可以被稱為…

configurablebeanfactory

ConfigurableBeanFactory定義BeanFactory的配置.ConfigurableBeanFactory中定義了太多太多的api,比如類加載器,類型轉化,屬性編輯器,BeanPostProcessor,作用域,bean定義,處理bean依賴關系,合并其他ConfigurableBeanFactory,bean如何銷毀. ConfigurableBeanFactory同時繼承了Hi…

Xlua文件在熱更新中調用方法

Xlua文件在熱更新中調用方法 public class news : MonoBehaviour { LuaEnv luaEnv;//定義Lua初始變量 void Awake() { luaEnv new LuaEnv();//new開辟空間 luaEnv.AddLoader(myload);//調用方法地址、返回字節 luaEnv.DoString("requirefish");//更新文件 } void O…

springboot 使用的配置

1&#xff0c;控制臺打印sql logging:level:com.sdyy.test.mapper: debug 2&#xff0c;開啟駝峰命名 mybatis.configuration.map-underscore-to-camel-casetrue 轉載于:https://www.cnblogs.com/xiaohu1218/p/10477318.html

AutowireCapableBeanFactory接口

AutowireCapableBeanFactory在BeanFactory基礎上實現了對存在實例的管理.可以使用這個接口集成其它框架,捆綁并填充并不由Spring管理生命周期并已存在的實例.像集成WebWork的Actions 和Tapestry Page就很實用. 一般應用開發者不會使用這個接口,所以像ApplicationContext這樣的…

外觀模式

一、什么是外觀模式   有些人可能炒過股票&#xff0c;但其實大部分人都不太懂&#xff0c;這種沒有足夠了解證券知識的情況下做股票是很容易虧錢的&#xff0c;剛開始炒股肯定都會想&#xff0c;如果有個懂行的幫幫手就好&#xff0c;其實基金就是個好幫手&#xff0c;支付寶…