ASP.NET MVC5 高級編程-學習日記-第三章 視圖

来源:https://www.cnblogs.com/Aries-rong/archive/2018/12/26/10119078.html
-Advertisement-
Play Games

開發人員之所以花費大量時間來重點設計控制器和模型對象,是因為在這些領域中,精心編寫的整潔代碼是開發一個可維護Web應用程式的基礎。 3.1 視圖的作用 視圖的職責是向用戶提供用戶界面。當控制器針對被請求的URL執行完合適的邏輯後,就將要顯示的內容委托給視圖。 不像基於文件的Web框架,比如ASP.N ...


開發人員之所以花費大量時間來重點設計控制器和模型對象,是因為在這些領域中,精心編寫的整潔代碼是開發一個可維護Web應用程式的基礎。

3.1 視圖的作用

視圖的職責是向用戶提供用戶界面。當控制器針對被請求的URL執行完合適的邏輯後,就將要顯示的內容委托給視圖。

不像基於文件的Web框架,比如ASP.NET Web Forms和PHP,視圖本身不會被直接訪 問,瀏覽器不能直接指向一個視圖並渲染它。相反,視圖總是被控制器渲染,因為控制器為它提供了要渲染的數據

在一些簡單的情況中,視圖不需要或需要很少控制器提供的信息。更常見的情況則是控制器需要向視圖提供一些信息,所以它會傳遞一個數據轉移對象,叫做模型。視圖將這個模型轉換為一個適合顯示給用戶的格式。在ASP.NET MVC中,完成這一過程由兩部分操作,其中一個是檢查由控制器提交的模型對象,另一個是將其內容轉換為HTML格式。

3.2 視圖的基礎知識

在最簡單的情況中,向控制器發出一個請求,控制器返回一個視圖,其實就是一些靜態的HTML。很容易,但是動態性不好。前面說過,視圖提供了一個模板引擎。下麵我們就利用這個模板引擎,從控制器向視圖傳遞少量數據。最簡單的方法就是使用ViewBag。ViewBag具有局限性,但是如果只是向視圖傳遞少數數據,他還是很有用的。

這與前面的Index方法幾乎相同,但是註意控制器將ViewBag.Message屬性值設置成一個字元串。然後再調用return View()。

3.3 理解視圖約定

這一節要介紹ASP.NET MVC如何找到正確的視圖進行渲染,以及如何重寫這個視圖,為一個控制器操作指定特定的視圖。

本章到現在為止介紹的控制器操作簡單地調用return View()來渲染視圖,還不需要指定指定視圖的文件名。可以這麼做,是因為它們利用了ASP.NET MVC框架的一些隱式約定,這些約定定義了視圖選擇邏輯。 

當創建新的項目模板時,將會註意到,項目以一種非常具體的方式包含了一個結構化的View目錄。

在每個控制器的View文件夾中,每個操作方法都有一個同名的視圖文件與其對應。這就提供了視圖與操作方法關聯的基礎。

與ASP.NET MVC中的大部分約定設置一樣,這一約定是可以重寫的。如果想要Index操作方法渲染一個不同的視圖,可以向其提供一個不同的視圖名稱。例如:

3.4 強類型視圖

通過ViewBag向視圖傳遞少量數據,儘管對於簡單的情況,使用ViewBag很容易,但是處理實際數據時,ViewBag就變得不方便,這時就需要使用強類型視圖。 

我們首先看一個不合適使用ViewBag的例子。不必擔心要鍵入這些代碼,它們只是用來進行說明的。

3.4.1 ViewBage的不足

強類型視圖允許設置視圖的模型類型。因此,我們可以從控制器向視圖傳遞一個在兩端都是強類型的模型對象,從而獲得智能感知、編譯器檢查等好處。

 

對於在視圖中經常使用的名稱空間,一個較好的方法就是在Views目錄下的web.config文件聲明。

3.4.2 理解ViewBag、ViewData和ViewDataDictionary

從技術角度講,數據從控制器傳送到視圖是通過一個名為ViewData的ViewDataDictionary(這是一個特殊的字典類)。我們可以使用標準的字典語法設置或讀取其中的值,實例如下:

ViewData["CurrentTime"]=DateTime.Now;

ViewBag是ViewData的動態封裝器。這樣我們就可以按照下麵的方式來設置值:ViewBag.CurrentTime=DateTime.Now;

因此,ViewBag.CurrentTime等同於ViewData["CurrentTime"]。

一般來說,我們將遇到的大部分代碼使用ViewBag,而不是ViewData。 大多數情況下,這兩種語法彼此之間並不存在真正的技術差異。ViewBag相對於字典語法而言僅僅是一種受開發人員歡迎、看上去很好看的語法而已。

 ViewData和ViewBag


二者很明顯的一個差異就是只有當要訪問的關鍵字是一個有效的C#標識符時,ViewBag才起作用。例如,如果在ViewData["Key With Spaces"]中存放一個值,那麼就不能使用ViewBag訪問。因為這樣根本就無法通過編譯。

另一個需要知道的重要差異就是,動態值不能作為一個參數傳遞給擴展方法。因為C#編譯器為了選擇正確的擴展方法,在編譯時必須知道每一個參數的正確類型。

如果其中任何一個參數是動態的,那麼就不會通過編譯。例如這行代碼就會編譯失敗:

@Html.TextBox("name",ViewBag.Name).要使這行代碼通過編譯有兩種方法:第一是使用ViewData["Name"]。第二種是把ViewData["Name"]值轉換成一個具體的類型(string)ViewData["Name"]。

如剛纔所述,ViewDataDictionary是一個特殊的字典類,而並不只是一個通用的Dictionary。原因之一在於,它有一個額外的Model屬性,允許向視圖提供一個具體的模型對象。因為ViewData中只能有一個模型對象,所以使用ViewDataDictionary向視圖傳遞具體的類十分方便。這樣一來,視圖就可以指定他希望哪個類作為模型對象,從而讓我們能夠利用強類型。

3.5 視圖模型

視圖通常需要顯示各種沒有直接映射到域模型的數據。

把與視圖主模型無關的數據存放在ViewBag屬性中,可以很容易地實現這些數據在視圖中的顯示。當具有一個清晰定義的模型和一些額外的引用數據時,這種方法尤為有用。這種技術的一種常見的應用是使用ViewBag為下拉列表提供表單選項。例如,MVC Music Store項目的Album Edit視圖需要填充Genres和Albums下拉列表,但是這些列表不適合放到Albums模型中。為了應對這些情況,同時不適用無關信息影響Album模型,我們可以將Genre和Album的信息保存到ViewBag中。如下所示:

這麼做當然能夠完成要求,並且也為在視圖中顯示數據提供了一種靈活的方法。但是這並不是一種應該經常使用的方法。一般應該堅持使用強類型模型對象————必須使所有數據都是強類型數據,以便視圖編寫人員能夠利用智能感知功能。

3.6 添加視圖

如何創建視圖呢?可以手動創建視圖文件,然後把它添加在Views目錄下。

顯示添加視圖對話框最簡單的方法就是在操作方法上右擊。

3.7 Razor視圖引擎

3.7.1 Razor的概念

Razor視圖引擎是ASP.NET MVC3中新擴展的內容,並且也是它的預設視圖引擎。

Razor通過理解標記的結構來實現代碼和標記之間儘可能順暢的轉換。

不要過多地考慮


 Razor的設計理念是簡單直觀。對於大多數應用,我們不必關心Razor語法----只需要在插入代碼時,輸入HTML和@符號。

3.7.2 代碼表達式

Razor中的核心轉換字元是“@”字元。這個單一字元用作標記-代碼的轉換字元,有時也反過來用作代碼-標記的轉換字元。

3.7.3 HTML編碼

Razor表達式是用HTML自動編碼的。

理解HTML和JavaScript編碼的安全隱患是很重要的。不正確的編碼會使網站和用戶處在危險境地。

3.7.4 代碼塊

Razor在視圖中除了支持代碼表達式以外,還支持代碼塊。

代碼塊除了需要@符號分割之外還需要使用花括弧。

3.7.5 Razor語法實例

1.隱式代碼表達式

<span>@model.Message</span>

Razor中的隱式代碼表達式總是採用HTML編碼方式。

 2.顯示代碼表達式

代碼表達式的值被計算並寫入到響應中,這就是在視圖中顯示值的一般原理。

1 <span>1+2=@(1+2)</span>

3.無編碼代碼表達式

 有些情況下,需要顯示地渲染一些不應該採用HTML編碼的值,這是可以採用Html.Raw方法來保證該值不被編碼。

<span>@Html.Raw(model.Message)</span>

4.代碼塊

不像代碼表達式先求得表達式的值,然後再輸出到響應,代碼塊是簡單地執行代碼部分。 

1 @{
2          int x=123;
3          string y="because.";
4  }

5.文本和標記相結合

 這個例子顯示了Razor中混用文本和標記的概念:

1 @foreach(var item in items)
2  {
3          <span>Item @item.Name</span>
4  }

6.混合代碼和純文本

 Razor查找的標簽的開始位置以確定何時將代碼轉換為標記。然而,有時可能想在一個代碼塊之後立即輸出純文本。例如,在下麵的這個例子中就是展示如何在一個條件語句塊中顯示純文本。

1 @if(showMessage){
2          <text>This is plain text.</text>
3  }

1 @if(showMessage){
2         @:This is plain text.
3  }

7.轉義代碼分隔符

 用"@@"來編碼"@"以達到顯示"@"的目的。

8.伺服器端的註釋

 @**@

9.調用泛型方法

 調用泛型方法的代碼包括尖括弧。

@(Html.SomeMethod<AType>())

3.7.5 佈局

Razor的佈局有助於使應用程式中的多個視圖保持一致的外觀。

3.7.6 ViewStart

每一個視圖都是使用Layout屬性來指定它的佈局。如果多個視圖使用同一個佈局,就會產生冗餘,並且很難維護。

_ViewStart.cshtml頁面可用來消除這種冗餘。這個文件中的代碼鹹魚同目錄下任何視圖代碼的執行。這個文件也可以遞歸的應用到子目錄下的任何視圖。

當創建一個預設的ASP.NET MVC項目時,你將會註意到在Views目錄下會自動添加一個_ViewStart.cshtml文件,它指定了一個預設佈局。

1 @{
2          Layout="~/Views/Shared/_Layout.cshtml";
3  }

因為這個代碼優先於任何視圖運行,所以一個視圖可以重寫Layout屬性的預設值,從而重新選擇一個不同的佈局。如果一組視圖擁有共同的設置,那麼_ViewStart.cshtml文件就有了用武之地,因為我們可以在它裡面對共同的視圖配置進行統一設置。如果有視圖需要覆蓋統一的設置,我們只需要修改對應的屬性值即可。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 利用線性基的合併,(直接暴力合併,複雜度62^2),當樹上路徑和來做,仿造java風格寫個類就好。。。(然後跑的巨慢,但是可以優化哈哈) cpp include using namespace std; const int N=2e4+7; / 我突然覺得,應該寫一個類。。 / struct Sha ...
  • 運行結果 ...
  • 本節將在第四節基礎上介紹如何實現IdentityServer4從資料庫獲取User進行驗證,並對Claim進行許可權設置。 一、新建Web API資源服務,命名為ResourceAPI (1)新建API項目,用來進行user的身份驗證服務。 (2)配置埠為5001 安裝Microsoft.Entit ...
  • 上節以對話形式,大概說了幾種客戶端授權模式的原理,這節重點介紹Hybrid模式在MVC下的使用。且為實現IdentityServer4從資料庫獲取User進行驗證,並對Claim進行許可權設置打下基礎(第五節介紹)。 本節內容比較多,且涉及一、二節的內容,如有不懂,可先熟悉一、二節知識。 一、新建授權 ...
  • C 中關於增強類功能的幾種方式 本文主要講解如何利用C 語言自身的特性來對一個類的功能進行豐富與增強,便於拓展現有項目的一些功能。 拓展方法 擴展方法 被定義為靜態方法,通過實例方法語法進行調用。方法的第一個參數指定該方法作用於哪個類型,並且該參數以 this 修飾符為首碼。僅當使用 using 指 ...
  • 使用System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile進行MD5加密時,會出現已過時 ...
  • 1. IsAssignableFrom實例方法 判斷一個類或者介面是否繼承自另一個指定的類或者介面。 輸出結果: IDog was inherited from IAnimalDog was inherited from IAnimalDog was inherited from IDogCate ...
  • 最近把項目更新到了ASP.Net Core 2.2,發佈之後發現在IIS下使用SQLite資料庫不行了,報異常說不能打開資料庫。"unable to open database file",奇了個怪了。照理說這個不是許可權就是路徑錯了,許可權直接加了Everyone也無濟於事,後來換成絕對路徑就可以了,... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...