日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

Nancy in .Net Core学习笔记 - 视图引擎

發(fā)布時(shí)間:2023/12/13 asp.net 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nancy in .Net Core学习笔记 - 视图引擎 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前文中我們介紹了Nancy中的路由,這一篇我們來介紹一下Nancy中的視圖引擎。

Nancy中如何返回一個(gè)視圖(View)

在ASP.NET Mvc中,我們使用ViewResult類來返回一個(gè)視圖。Nancy中也提供了類似的功能, 在NancyModule類中,Nancy提供了一個(gè)ViewRenderer類型的View的屬性來返回視圖。

ViewRenderer類代碼如下,該類中提供了三個(gè)屬性訪問器

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] - 僅指定呈現(xiàn)的數(shù)據(jù)模型, Nancy會根據(jù)url自動匹配一個(gè)View文件
public Negotiator this[string viewName] - 僅指定返回的View文件名
public Negotiator this[string viewName, [Dynamic] dynamic model] - 不僅指定的View的文件名,還指定了用于呈現(xiàn)的數(shù)據(jù)模型

下面我們修改之前的HelloModule.cs, 添加一個(gè)/hello的路由模板, 并使用View屬性來返回一個(gè)視圖

public class HelloModule : NancyModule{public HelloModule(){Get("/hello", p => View["hello.html"]);}}

然后我們創(chuàng)建一個(gè)wwwroot目錄,并在其中添加一個(gè)hello.html, 里面的代碼如下

<h1>Hello World</h1>

現(xiàn)在我們啟動項(xiàng)目, 并輸入/hello, 瀏覽器返回的結(jié)果如下。

不要慌張,這說明我們的請求被Nancy處理了,只是因?yàn)樵诜?wù)器上沒有正確找到hello.html這個(gè)文件,所以報(bào)錯(cuò)了,繼續(xù)看完下一節(jié)的內(nèi)容,你的頁面就能正確顯示。

Nancy中的視圖位置約定

Nancy中官網(wǎng)文檔中介紹了好幾種視圖的位置約定,它定義了Nancy中搜索視圖文件的順序和方式。

我們用以下代碼為例

public class HelloModule : NancyModule{public HelloModule(){Get("/hello", p => View["hello.html"]);}}

當(dāng)/hello請求進(jìn)入Nancy管道后,我們決定使用hello.html作為響應(yīng)頁面,當(dāng)Nancy嘗試尋找這個(gè)頁面時(shí),

  • Nancy首先會去尋找網(wǎng)站根目錄下"/views/[模塊名]/[指定頁面文件名]", 如果找的到該文件,Nancy即讀取該頁面內(nèi)容,并綁定數(shù)據(jù)模型返回給客戶端,這就是View and Module Name約定。在當(dāng)前例子中即/views/Hello/hello.html
  • 如果找不到文件,Nancy會繼續(xù)尋找網(wǎng)站根目錄下"/[模塊名]/[指定頁面文件名]", 這就是Module Name約定。當(dāng)前例子中即/Hello/hello.html
  • 如果還是找不到文件,Nancy會繼續(xù)尋找網(wǎng)站根目錄下"/views/[指定頁面文件名]", 這就是View Folder Name約定。當(dāng)前例子中即/views/hello.html
  • 如果還是找不到文件,Nancy最終會去尋找網(wǎng)站根目錄下"/[指定頁面文件名]",這就是Root約定。當(dāng)前例子中即/hello.html
  • 如果都找不到, Nancy會返回一個(gè)錯(cuò)誤頁

切換網(wǎng)站根目錄

在.NET Core中我們通常會將靜態(tài)文件方式在wwwroot目錄中, 而非網(wǎng)站根目錄 這樣會導(dǎo)致Nancy不能正確訪問到正確的靜態(tài)文件。這里我們就需要去修改Nancy默認(rèn)的網(wǎng)站根目錄設(shè)置。

Nancy我們可以通過實(shí)現(xiàn)IRootPathProvider接口的GetRootPath方法, 并覆蓋DefaultNancyBootstrapper類中的RootPathProvider屬性來實(shí)現(xiàn)自定義網(wǎng)站根目錄。

首先我們創(chuàng)建一個(gè)新類CustomRootPathProvider。

public class CustomRootPathProvider : IRootPathProvider{public string GetRootPath(){return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot");}}

代碼中通過拼接目錄, 我們將當(dāng)前網(wǎng)站的根目錄指向了wwwroot。

然后我們創(chuàng)建一個(gè)新類CustomBootstrapper, 讓它繼承NancyDefaultBootstrapper類并使用CustomerRootPathProvider作為Nancy的RootPathProvider。

public class CustomBootstrapper : DefaultNancyBootstrapper{protected override IRootPathProvider RootPathProvider{get{return new CustomRootPathProvider();}}}

特別注意:當(dāng)創(chuàng)建自定義Bootstrapper之后,之前的Nancy的Trace功能會被屏蔽掉,如果想重新啟用Trace功能,需要在CustomBootstrapper中加入如下代碼。

public override void Configure(INancyEnvironment environment){environment.Tracing(enabled: true, displayErrorTraces: true);base.Configure(environment);}

現(xiàn)在我們重啟項(xiàng)目, 輸入/hello, 頁面正確顯示了。

Nancy中支持的視圖引擎

Nancy中支持的視圖引擎如下

  • Super Simple View Engine(SSVE)
  • Razor
  • Spark
  • NDjango
  • dotLiquid

這里我們重點(diǎn)說明一下SSVE。

超級簡單的視圖引擎(Super Simple View Engine)

Super Simple View Engine, 簡稱SSVE, 是Nancy默認(rèn)提供的視圖引擎, 我們前面的例子使用的就是SSVE視圖引擎。

下面我們介紹一個(gè)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

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>

條件

語法

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

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

例:
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>

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

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>

Razor

SSVE視圖引擎雖然很簡單,但是提供的方法不多,應(yīng)對許多復(fù)雜場景,都需要去自定義語法模板。
除了SSVE, Nancy中還可以使用和ASP.NET Mvc中一樣的Razor視圖引擎, 其中的語法和使用方式與ASP.NET Mvc中的Razor引擎基本一樣。但是需要注意的是Nancy.Viewengines.Razor還沒有完成針對.NET Stardard重寫,所以如果想在Nancy中使用Razor引擎的同學(xué)只能在非.NET Core項(xiàng)目中使用它, 相關(guān)的教程請參見官網(wǎng)

總結(jié)

Nancy的視圖引擎自2016.12月之后就沒有再發(fā)布了, 個(gè)人感覺Nancy現(xiàn)在發(fā)展的重點(diǎn)已經(jīng)不再視圖引擎上了, Nancy更多的作為WebApi來使用,最近有發(fā)現(xiàn)一本書,介紹了Nancy的微服務(wù)實(shí)踐,有興趣的同學(xué)可以一起讀一下。

Microservices in .NET Core with Examples in Nancy
本篇博客源代碼

下一篇我們一起來學(xué)習(xí)Nancy中的數(shù)據(jù)模型綁定。

轉(zhuǎn)載于:https://www.cnblogs.com/lwqlun/p/9629185.html

總結(jié)

以上是生活随笔為你收集整理的Nancy in .Net Core学习笔记 - 视图引擎的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。