【ASP.NET系列】詳解Views

来源:https://www.cnblogs.com/wangjiming/archive/2018/01/01/8111977.html
-Advertisement-
Play Games

描述 本片文章內容屬於ASP.NET MVC系列視圖篇,主要講解View,大致內容如下: 1.Views文件夾講解 2.View種類 3.Razor語法 4.對視圖的基本操作 一 Views文件夾 (一) Views文件夾下常用文件種類 分析: 1.ASP.NET MVC頁面基本被放在Views文件 ...


 

描述

本片文章內容屬於ASP.NET MVC系列視圖篇,主要講解View,大致內容如下:

1.Views文件夾講解

2.View種類

3.Razor語法

4.對視圖的基本操作

 

一   Views文件夾

(一) Views文件夾下常用文件種類

 分析:

1.ASP.NET MVC頁面基本被放在Views文件夾下;

2.利用APS.NET MVC模板生成框架,Views文件夾下的預設頁面為.cshtml頁面;

3.ASP.NET MVC預設頁面為Razor格式的頁面,因此預設頁面為.cshtml頁面;

4.ASP.NET MVC中,支持WebForm頁面,即.aspx頁面;

5.ASP.NET MVC中,支持靜態html頁面;

(二) 預設Views文件夾包含內容

 分析:

1.這裡沒添加Account控制器;

2).預設約定:在Controllers新增一個控制器,就會預設地在Views文件夾下新增一個視圖問價,用來存放該控制器添加的視圖,如上圖中增加Home控制器,

在Views下就自動新增加Home文件,用來存放是Home控制器視圖; 

二 視圖種類

(一) 起始視圖——_ViewStart.cshtml

分析:

1.打開_ViewStart.cshtml文件,我們發現該文件是引用Shared文件夾下的_Layout.cshtml文件,_Layout.cshtml是什麼文件?佈局頁,稍後將分析;

2.我們來做如下動作

(1)將_ViewStart.cshtml內容註釋掉,且添加一個div內容

(2)添加控制器_ViewStartDemoController和Index.cshtml視圖

(3)運行程式,訪問視圖:http://localhost:2016/_ViewStartDemo/Index

 分析:

查看html

(二)佈局視圖

如上,我們分析了_VeiwStart.cshtml文件,我們發現裡面有一段代碼

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

不理解這局話不要緊,它採用的Razor語法格式,將稍後與大家分享Razor,但我們看到了_Layout.cshtml文件,該文件即是Views文件夾下,Shared文件夾下的_Layout.cshtml視圖

1.查看_Layout.cshtml視圖

 

分析:

(1)_Layout.cshtml基本結構就是HTML基本結構(其實,.aspx和.cshtml結構,均是html結構);

(2)我們發現在<body></body>區域,有兩個後臺代碼:@RenderBody()和@RenderSection()。@RenderBody()表示視圖體,@RenderSection()表示部分視圖和節點;

(3)我們將程式運行起來,看看

分析:

(1)我們發現最終呈現的頁面由兩部分組成:Layout.cshtml頁面(由_ViewStart.cshtml頁面引用_Layout.cshtml頁面實現)和Home控制器下的Index頁面;

(2)_Layout.cshtml到底是什麼?佈局頁,相當於WebForm的模板頁面;

(3)下麵我們來定義一個模板頁

 

(三)強類型視圖

 何為“強類型視圖”?Controller向View傳遞少量數據,一般情況,我們可以歸為兩大類別:弱類別傳遞(ViewBag,ViewData,TempData)和強類別傳遞(強類型視圖)。然而,在實際操作中,當涉及大量數據時,

弱類別就顯得不是那麼方便,此時,一般採用強類型視圖。強類型視圖一般由三部分構成,即控制器層,視圖層和模型層,三者之間調用關係可表示為:

 

 

 1.創建一個強類型視圖

(1)在Model文件夾添加一個UserInfo類

public class UserInfo
    {
        string UserName { get; set; }
        string UserAddress { get; set; }
    }

(2)在控制器PartialViewDemo中添加一個方法QiangLeiXing(),並添加視圖

(3)強類型視圖分析

使用強類型視圖,從控制器向視圖傳遞一個在兩端都是強類型的模型對象,從那個人獲得智能感知、編譯檢查等好處。在Controller方法中,可以通過向重載的View方法中傳遞模型實例來指定模型。

 public ActionResult QiangLeiXingView()
        {
            List<UserInfo> List_UserInfo = new List<UserInfo>();
            for (int i = 0; i < 2; i++)
            {
                List_UserInfo.Add(new UserInfo() { UserName = "Alan_beijing" + i, UserAddress = "上海" + (i++) });
            }
            ViewBag.List_UserInfo = List_UserInfo;
            return View(List_UserInfo);
        }

下一步是告知視圖哪種類型的模型正在使用@model聲明。註意,這裡需要輸入模型的完全限定名(名稱空間和類型名稱)

@model IEnumerable<ViewDemo.Models.UserInfo>

對應View

@model IEnumerable<ViewDemo.Models.UserInfo>

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>QiangLeiXingView</title>
</head>
<body>
    <div> 
        <ul>
            @foreach(ViewDemo.Models.UserInfo V_UserInfo in Model)
            {
                @V_UserInfo.UserName
                @V_UserInfo.UserAddress
                <br/>
            }
        </ul>
    </div>
</body>
</html>

當然你也可以採用如下限定

@using ViewDemo.Models
@model IEnumerable<UserInfo>

對應的View

@using ViewDemo.Models
@model IEnumerable<UserInfo>

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>QiangLeiXingView</title>
</head>
<body>
    <div> 
        <ul>
            @foreach(UserInfo V_UserInfo in Model)
            {
                @V_UserInfo.UserName
                @V_UserInfo.UserAddress
                <br/>
            }
        </ul>
    </div>
</body>
</html>

2.關於Controller和View之間傳值,請參考我的另一篇文章:【ASP.NET MVC】View與Controller之間傳遞數據

由於本篇文章關於頁面之間傳值講得比較詳細,因此這裡就不分析了。

3.我們來分析一下,為什麼使用弱型別來傳遞不是很方便的原因

關於這個例子,只舉例ViewBag(ViewData和TempData差不多原理)

 (1)在控制器PartialViewDemo中添加方法

 /// <summary>
        /// 弱類型視圖,使用ViewBag來傳遞數據
        /// </summary>
        /// <returns></returns>
        public ActionResult RuoLeiXingView()
        {
            List<UserInfo> List_UserInfo = new List<UserInfo>();
            for (int i = 0; i < 2; i++)
            {
                List_UserInfo.Add(new UserInfo() { UserName = "Alan_beijing" + i, UserAddress = "上海" });
            }
            ViewBag.List_UserInfo = List_UserInfo;
            return View();
        }

(2)在視圖中接收數據

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>RuoLeiXingView</title>
</head>
<body>
    <div>
        @foreach(ViewDemo.Models.UserInfo V_UserInfo in (ViewBag.List_UserInfo as IEnumerable<ViewDemo.Models.UserInfo>))
        {
            @V_UserInfo.UserName
            @V_UserInfo.UserAddress
            <br />
        }
   </div>
</body>
</html>

我們發現在枚舉之前,需要將動態的ViewBag.List_UserInf 轉化為IEnumerable<UserInfo>類型,比較麻煩,當然,你可以使用Dynamic代替

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>RuoLeiXingView</title>
</head>
<body>
    <div>
       @foreach(dynamic D_UserInfo in ViewBag.List_UserInfo)
        {
            @D_UserInfo.UserName
            @D_UserInfo.UserAddress
            <br />
        }
    </div>
</body>
</html>  

使用Dynamic似乎方便了許多,但細心的你可能已經發現,變數沒有了智能感應功能。

到此,大家應該明白了ViewBag的不方便性了,當然,細心的你又會發現,強類型視圖,剛好具備如上兩個優勢。

(四)部分視圖

 何為“分佈視圖”?在WebForm開發中,我們經常用到用戶自定義控制項,其作用是提高代碼的復用性,減少代碼的冗餘,使程式更加模塊化,那麼,在ASP.NET MVC中,對應地引入了基於Razor結構的分佈頁,其作用與

WebForm開發中的用戶自定義控制項差不多。

1. 創建分佈頁

我們在/Views/Shared文件夾下創建一個分佈頁_PartialPageDemo.cshtml,並向該頁面中添加一段代碼:

<h1 style="color:red">我是分佈頁</h1>

創建過程如下:

2.調用分佈頁

(1) 添加控制器PartialViewDemo和視圖Index.cshtml

(2)在Index.cshtml頁面中調用_PartialPageDemo.cshtml

 

3.調用分佈頁的幾種方式

方式一:

@Html.Partial()

方式二:

@Html.Action()

方式三:

 通過Ajax方式調用;

 

 三  Razor語法

 Razor視圖引擎是ASP.NET MVC3中新擴展的內容,並且也是他的預設視圖引擎,其設計理念是:簡單直觀。Razor視圖引擎可分為MVC和WebForm視圖引擎,基於篇幅限制,本文只分析MVC Razor視圖引擎。Razor中的核心轉

換符"@",代表:標記-代碼或代碼-標記的意思。一般有兩種基本轉換,即代碼表達式和代碼塊。

(一)代碼表達式

1.支持隱式代碼表達式求解

這個特性,在強類型視圖中,體現得很明顯。

<div> 
        <ul>
            @foreach(UserInfo V_UserInfo in Model)
            {
                @V_UserInfo.UserName
                @V_UserInfo.UserAddress
                <br/>
            }
        </ul>
    </div>

2.支持顯示代碼表達式

<div>1+2=@(1+2)<div>

 3.Razor十分智能,可以知道表達後面的空格字元不是一個有效的標識符,所以它可以順暢地轉回到標記語言。

4.自動識別郵件格式

會自動識別郵件,而並不是當作變數。

<div>@www.qq.com</div>

5.支持文本量

@{

      string  BlogName="Alan_beijing";
 }
<div>@BlogName.Views</div>

這段代碼回提示錯誤,提示string沒有Views屬性。

其實我們想要輸出的結果:Alan_beijing.Views,但@BlogName.Views  ,View被解析為BlogName的一個屬性,因此出錯,此時,應用字面量

@{

      string  BlogName="Alan_beijing";
 }
<div>@(BlogName).Views</div>

6.支持轉義字元

如我想輸出:@Alan_beijing

<div>@@Alan_beijing</div>

 

(二)支持HTML編碼

我們知道,在防止XSS攻擊時了(跨站腳本註入攻擊) ,首先要做到HTML編碼,Razor剛好是HTML編碼的。

@{

     string message="<script>alert('haacked!')</script>";

}
<span>@message<span>

 這段代碼不會彈出警告框而只會呈現編碼的HTML

<span>&alt;script>alert('haacked!');&alt;/script></span>

這裡不論述這個,後在【ASP.NET MVC系列】的後續篇幅中,專門講解。

(三) 代碼塊

這個大家應該用的比較多,foreach

<div> 
        <ul>
            @foreach(UserInfo V_UserInfo in Model)
            {
                @V_UserInfo.UserName
                @V_UserInfo.UserAddress
                <br/>
            }
        </ul>
    </div>

 

四  對視圖的基本操作

 ASP.NET MVC 提供的模板中,當創建View時,提供了六種模型,分別為Create,Delete,Detail,Edit,Empty,Empty(不具有模型),List。基於該模型,我們可以輕鬆地創建具體實體的增刪改查。由於比較簡單,本例只

簡單結合UserInfo實體演示Create,其他操作,請讀者自行操作,原理思路一樣,這裡不一 一論述。

 我們創建一個基礎UserInfo實體的Create

測試結果

四   參考文獻

【01】【01】ASP.NET MVC5 高級編程(Jon Galloway,Brad Wilson,K.Scott Allen,David Matson ,孫遠帥 譯)

【02】APS.NET MVC4

五  版權區

  • 感謝您的閱讀,若有不足之處,歡迎指教,共同學習、共同進步。
  • 博主網址:http://www.cnblogs.com/wangjiming/。
  • 極少部分文章利用讀書、參考、引用、抄襲、複製和粘貼等多種方式整合而成的,大部分為原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:[email protected]
  • 可以轉載該博客,但必須著名博客來源。

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

-Advertisement-
Play Games
更多相關文章
  • 註意迭代器和可迭代對象不同#迭代器:1、有iter方法,2、有next方法li=[1,2,3,4,5]d=iter(li) # 等於li.__iter__()print(d) # <list_iteratorobjectat0x00000174316CC3C8>可以通過next方法取出元素。for循 ...
  • 要讀取鍵盤輸入的數據,需要使用輸入流,可以是位元組輸入流,也可以是位元組輸入流轉換後的字元輸入流。 關於鍵盤輸入,有幾點註意的是:(1).鍵盤輸入流為System.in,其返回的是InputStream類型,即位元組流。(2).位元組流讀取鍵盤的輸入時,需要考慮回車符(\r:13)、換行符(\n:10)。( ...
  • 再有兩天就進入2018了,想想還是要準備一下明年的工作方向。回想當初開始學習函數式編程時的主要目的是想設計一套標準API給那些習慣了OOP方式開發商業應用軟體的程式員們,使他們能用一種接近傳統資料庫軟體編程的方式來實現多線程,並行運算,分散式的數據處理應用程式,前提是這種編程方式不需要對函數式編程語 ...
  • 一、Spring簡介 Spring MVC是當前最優秀的 MVC 框架,自從Spring 2.5 版本發佈後,由於支持註解配置,易用性有了大幅度的提高。Spring 3.0 更加完善,實現了對 Struts 2 的超越。現在越來越多的開發團隊選擇了Spring MVC。 1)Spring3 MVC使 ...
  • 除之前的Spring相關包,還有structs2包外,還需要Hibernate的相關包 首先,Spring整合其他持久化層框架的JAR包 spring-orm-4.2.4.RELEASE.jar (整合Hibernate的) 這個JAR包在Spring框架中包含 Hibernate 需要的JAR包 ...
  • 為什麼需要泛型? 試想你需要一個簡單的容器類,或者說句柄類,比如要存放一個蘋果的籃子,那你可以這樣簡單的實現: 這樣一個簡單的籃子就實現了,但問題是它只能存放蘋果,之後又出現了另外的一大堆水果類,那你就不得不為這些水果類分別實現容器: 然後你發現你其實在做大量的重覆勞動。所以你幻想你的語言編譯器要是 ...
  • 1 兩種文本編輯器:Sublime Text 、 Notepad++ 執行python文件,在命令行中,切換到該Python文件所在的目錄下,然後輸入 Python ###.py命令就可以了。 2 Python的交互模式和直接運行.py文件有什麼區別呢? 直接輸入python進入交互模式,相當於啟動 ...
  • 本文主要介紹Spring中, 1 Spring JDBC 2 使用註解方式管理事務的傳播行為 3 採用XML 方式配置事務 4 SH 整合 5 SSH 整合 一、Spring JDBC 1) 導包 , 使用myeclipse2014, 添加與持久化相關的包 2) 引入名稱空間等 3) 配置數據源 4 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...