【ASP.NET MVC系列】詳解View

来源: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
更多相關文章
  • 對於開發人員,把C#語言和.NET描述為最重要的新技術一點都不誇張。NET提供了一種環境。在這種環境中,可以開發在Windows上運行的幾乎所有應用程式。如:編寫Web頁面、WPF應用程式、REST Web服務、分散式應用程式的組件、資料庫訪問組件、傳統的Windows桌面應用程式,以及可以聯機/脫 ...
  • 知識點目錄 >傳送門 線程和進程的簡單概括。 1.進程就是"活動中"的程式,一個。程式是一個沒有生命的實體,只有處理器賦予程式生命時,它才能成為一個活動的實體,我們稱其為進程。進程之間是相互獨立的。程式是指令的集合,它是進程運行的靜態描述文本;進程是程式的一次執行活動,屬於動態概念。 2.線程有時候 ...
  • 準備 IDE:VisualStudio Language:VB.NET/C# GitHub:AutoJump.NET 本文將向你介紹一種通過圖像識別實現“跳一跳”機器人的方法。 第一節 圖像識別 文中提到的所有方法和步驟均僅涉及簡單的向量計算。 需要哪些計算? 比較像素點的顏色 求向量集合的中心 計 ...
  • 祝大家2018新年快樂, 前不久發現了一個創意的腳本JtSQL(java編寫) 開源地址為:https://github.com/noear/JtSQL JtSQL 特點:*.結合了JS、SQL、模板理念;*.保持了JS和SQL的語法高亮(利於DBA審核);*.方便統一管理、部署、運行*.像存儲過程 ...
  • SuperSocket 是什麼? 首先我們明確一下SuperSocket 本質是什麼? 網路框架 ! ok , 那麼我們直接上上官網,作者已經開源到Github,可以做兩件事 : 和我一步一個腳印 首先拿到源碼,並讓Demo跑起來 下載master 分支 然後下載v1.6 版本(具體版本以最新為準) ...
  • 大概已經習慣了黑底白字的控制台程式了:今天貼一下實現控制台輸出彩色文字及背景的最簡單方法! 方法1: 1.設置控制台背景顏色; 2設置控制台前景色; 3調用WriteLine(XXX)方法輸出內容 4.調用ResetColor()方法恢復控制台 下麵是一個簡單實例: class Program { ...
  • 看完.NET 基金會、 Roslyn 編譯器 ,應該已經能慢慢瞭解,現在所謂的“.NET 開源”、“.NET Open Source”並不是完全把現有的 .NET Framework 整個打開(雖然這裡有個子集的參考版【https://github.com/Microsoft/referenceso ...
  • 添加實體數據模型 下一步 下一步 添加web窗體 簡單添加一個操作按鈕 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...