ASP.NET Core 2 學習筆記(十)視圖

来源:https://www.cnblogs.com/snaildev/archive/2018/06/04/9132661.html
-Advertisement-
Play Games

ASP.NET Core MVC中的Views是負責網頁顯示,將數據一併渲染至UI包含HTML、CSS等。並能痛過Razor語法在*.cshtml中寫渲染畫面的程式邏輯。本篇將介紹ASP.NET Core MVC的Views。 之前 ASP.NET Core 2 學習筆記(六)MVC 有稍微介紹到V ...


ASP.NET Core MVC中的Views是負責網頁顯示,將數據一併渲染至UI包含HTML、CSS等。並能痛過Razor語法在*.cshtml中寫渲染畫面的程式邏輯。
本篇將介紹ASP.NET Core MVC的Views。

之前 ASP.NET Core 2 學習筆記(六)MVC 有稍微介紹到Views及Controller的對應關係,這邊就不重覆說明。

Razor 語法

ASP.NET Core MVC的Views預設是使用Razor引擎,Views的擴展名是用*.cshtml。文件內容以HTML為主,但可以通過@Razor語法寫C#程式。可以假想一下*.cshmtl就是一般的HTML,而Razor語法是C#程式跟靜態HTML溝同的媒介。

@就是Razor語法最重要的溝同媒介,在C#變數前面加上@,就可以將C#程式混合成HTML輸出。如果要在HTML顯示@符號的話,可以連用兩個@符號,就可以把@輸出,範例如下:

<div>@@DateTime.Now @DateTime.Now</div>
<div>
    @@(DateTime.Now - TimeSpan.FromDays(7)) 
    @(DateTime.Now - TimeSpan.FromDays(7))
</div>

實際輸出的HTML 結果:

<div>@DateTime.Now 2018-06-04 10:32:38</div>
<div>
    @(DateTime.Now - TimeSpan.FromDays(7)) 
    2018-05-28 10:32:38
</div>

控制結構(Control Structures)

如果有需要也可以在Views寫C#代碼,通過@{ }定義程式區塊,便可以在Views中寫C#程式,如下:

也可以在迴圈、判斷式或C#區塊的關鍵字前加上@表示程式區塊,如:@if@switch@for@foreach@while@do{ }while()@try@using@lock
範例如下:

@{
    bool flag = true;
    int number = 3;
}

@if(flag)
{
  <div>flag is true</div>
} 
else
{
  <div>flag is false</div>
}

@switch(number)
{
    case 3:
        <div>number is lucky 3!!!!</div>
        break;
    default:
        <div>number is @number</div>
        break;
}

@for(var i = 0; i < number; i++)
{
    <div>For sample: @i</div>
}

@try
{
    throw new Exception("something wrong");
}
catch(Exception ex)
{
    <div>@ex.Message</div>
}

 輸出畫面:

指令(Directives)

Razor Views 會被Razor 引擎動態轉換成Class,所以也有些類似C# Class 的方法可以使用。

  • @using
    同C# Class的using,載入不同namespaces,簡化使用時的名稱。例:

 

@using System.IO
@{
    var dir = Directory.GetCurrentDirectory();
}
<p>@dir</p>
  • @model
    用來綁定Controller傳來的Model類型,並填入Model屬性中,在Views中就可以通過Model取得Controller傳來的Model。例:

@using MyWebsite.Models
@model UserModel
Hello~ 我是 @Model.Name
  • @inherits
    讓Razor View繼承其他自定義的RazorPage類型。例:
    CustomRazorPage.cs

using Microsoft.AspNetCore.Mvc.Razor;

public abstract class CustomRazorPage<TModel> : RazorPage<TModel>
{
    public string CustomText { get; } = "CustomRazorPage.CustomText";
}

  Sample.cshtml

@using MyWebsite.Utils

@inherits CustomRazorPage<TModel>
<div>Custom text: @CustomText</div>
@functions {
    public string GetHello()
    {
        return "Hello";
    }
}
<div>From method: @GetHello()</div>
  • @section
    配合Layout 排版使用,下麵會介紹。

Layout

通常網站的頁面都有類似的風格,可能只有部分的內容會不一樣,這種清況很適合用Layout。
以下圖為例,網站的每頁都會有Header及Footer而且都長的一樣,就只有Content會不同。

通常Layout都會放在Views\Shared資料夾,建立一個_Layout.cshtml

Views\Shared\_Layout.cshtml

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    @RenderSection("styles", required: false)
</head>
<body>
    <header>
        Layout Header
    </header>
    <div>
        <h1>@ViewBag.Title</h1>
        @RenderBody()
    </div>
    <footer>
        Layout footer
    </footer>
    @RenderSection("scripts", required: false)
</body>
</html>

在要套用Layout 的Views,指派要套用的Layout 名稱,如下:

Views\Home\Index.cshtml

@using MyWebsite.Models
@model UserModel
@{
    Layout = "_Layout";
    ViewBag.Title = "Sample";
}

<div>Hello~ 我是 @Model.Name</div>

@section styles {
  <link rel="stylesheet" type="text/css" href="/css/theme.css">
}
@section scripts {
  <script type="text/javascript" src="/js/jquery.js"></script>
} 
  • Layout
    Layout是指定要套用Layout的名稱,預設會在文件夾Views\Shared尋找{Layout 名稱}.cshtml
    也可以指定完整路徑,如:Layout = "/Views/Shared/_Layout.cshtml"
  • ViewBag
    ViewBag是Dynamic類型的對象,可以在同一個Request中,跨Controller及Views存取數據。
  • @section
    在使用Layout時,並不一定會將Razor View全部填入至RenderBody,可能會有需求將某些內容填入至Layout的其他地方。如:*.css的引用填入至<head></head>中;*.js的引用填入至</body>之前。

當打開http://localhost:5000/home/index時,Razor引擎會將Index.cshtml的結果都填入Views\Shared\_Layout.cshtml@RenderBody()
實際輸出的HTML結果:

<!DOCTYPE html>
<html>
<head>
    <title>Sample</title>
    
  <link rel="stylesheet" type="text/css" href="/css/theme.css">

</head>
<body>
    <header>
        Layout Header
    </header>
    <div>
        <h1>Sample</h1>
        
<div>Hello~ 我是 SnailDev</div>


    </div>
    <footer>
        Layout footer
    </footer>
    
  <script type="text/javascript" src="/js/jquery.js"></script>

</body>
</html>

_ViewImports

上例Views\Home\Index.cshtml有用到@using MyWebsite.Models,實務上可能每個Razor View都會用到@using MyWebsite.Models,如果每個*.cshtml都加上這行就會顯得有點笨拙。
可以通過_ViewImports.cshtml把通用性的@using都加到這邊,如此一來就可以套用到全部的Razor View,如:

Views\_ViewImports.cshtml

@using System.IO
@using System.Collections.Generic
@using MyWebsite
@using MyWebsite.Models

如此一來就能將Views\Home\Index.cshtml第一行的@using MyWebsite.Models移除。

_ViewStart

指定Layout也會有套用全部Razor View的需求,可以通過_ViewStart.cshtml,在Razor View的第一個渲染事件指派預設Layout,如:

Views\_ViewStart.cshtml

@{
    Layout = "_Layout";
}

Partial Views

有些重覆性很高的畫面,如果散落在各個Razor View,在維護上就會比較麻煩。
可以通過Partial Views把重覆的內容變成組件,再重覆使用。範例如下:

 Controllers\HomeController.cs

// ...
public class HomeController : Controller
{
    public IActionResult Index(int id)
    {
        return View(new List<UserModel>()
        {
            new UserModel()
            {
                Id = 1,
                Name = "John",
                Email = "[email protected]",
            },
            new UserModel()
            {
                Id = 2,
                Name = "Blackie",
                Email = "[email protected]"
            },
            new UserModel()
            {
                Id = 3,
                Name = "Claire",
                Email = "[email protected]"
            }
        });
    }
}

Views\Home\_UserInfo.cshtml

@model UserModel
<div>
    <label>Id:</label>@Model.Id <br />
    <label>Name:</label>@Model.Name <br />
    <label>Email:</label>@Model.Email <br />
</div>

Views\Home\Index.cshtml

@model List<UserModel>
@{
    ViewBag.Title = "User List";
}

@foreach(var user in Model)
{
    @Html.Partial("_UserInfo", user)
    <hr />
}

實際輸出的HTML 結果:

<!DOCTYPE html>
<html>
<head>
    <title>User List</title>
</head>
<body>
    <header>
        Layout Header
    </header>
    <div>
        <h1>User List</h1>
        <div>
            <label>Id:</label>1 <br />
            <label>Name:</label>John <br />
            <label>Email:</label>[email protected] <br />
        </div>
        <hr />
        <div>
            <label>Id:</label>2 <br />
            <label>Name:</label>Blackie <br />
            <label>Email:</label>[email protected] <br />
        </div>
        <hr />
        <div>
            <label>Id:</label>3 <br />
            <label>Name:</label>Claire <br />
            <label>Email:</label>[email protected] <br />
        </div>
        <hr />
    </div>
    <footer>
        Layout footer
    </footer>
</body>
</html>

後記

Views的渲染過程都還是在Server端,所以可以通過Razor寫C#代碼。
Razor引擎最終會將渲染的結果以HTML的方式回傳給Client。
回顧 ASP.NET Core 2 學習筆記(六)MVC 數據流動畫:

 

要註意的是,Razor 的渲染是耗用Server 的CPU 資源,如果有多筆的數據通過迴圈產生HTML,也會變成網路傳輸的負擔。如果要註重性能,建議用Single Page Application(SPA) 的方式取代Razor。

參考

Views in ASP.NET Core MVC 
Razor syntax for ASP.NET Core 
Partial Views

 

老司機發車啦:https://github.com/SnailDev/SnailDev.NETCore2Learning


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

-Advertisement-
Play Games
更多相關文章
  • ​ 應用場景: 用戶在註冊或者密碼丟失等過程中,賬號綁定郵箱,用戶在進行身份認證的過程中,電子郵箱確實是一種很常用的方式,Python中提供了smtplib可以實現發送電子郵件功能,Flask框架也有對應的flask email庫,擴展對電子發送的支持 安裝 導入及初始化 Flask mail可以連 ...
  • django反向解析URL和URL命名空間 首先明確幾個概念: 1.在html頁面上的內容特別是向用戶展示的url地址,比如常見的超鏈接,圖片鏈接等,最好能動態生成,而不要固定. 2.一個django項目中一般包含了多個django應用(app). 3.一個視圖(view)往往對應多個url地址. ...
  • 1、前言 因為負責基礎服務,經常需要處理一些數據,但是大多時候採用awk以及java程式即可,但是這次突然有百萬級數據需要處理,通過awk無法進行匹配,然後我又採用java來處理,文件一分為8同時開啟8個線程併發處理,但是依然處理很慢,處理時長起碼在1天+所以無法忍受這樣的處理速度就採用python ...
  • 獻上我的做題方法和思路。 class Solution(object): def longestCommonPrefix(self, strs): """ :type strs: List[str] :rtype: str """ common = '' time = 0 len_list = [] ...
  • 在周末的一個早上,小白還在做著美夢,就收到了小美的連環追魂call,電話一直響個不停。 小白打著哈欠拿起電話:早上好美女。 小美:出事了出事了,我們公司網站一早訪問是一片空白,什麼內容都沒有了,你趕急上去看看是怎麼回事。 小白一聽到馬上緊張了起來,趕緊說:好的,我先看看,一會回電話給你。 小白說完趕 ...
  • 在很多項目的很多地方都發現了一個共同的術語 反射 有時候我在想這是個什麼東西,能幹啥。 這幾天靜下心來,好好地去翻了翻書,看了看別人的博客。 也自己比著寫了兩個泛型反射方法。還算理解了一小部分,寫個記錄。 上例子代碼: 這是通過反射工廠來創建實例: 這是將Datatable里的數據反射到LIst集合 ...
  • 這篇來看一下反射的使用吧!舉個例子! 舉例子,肯定需要一個類啦,先建一個學生例子類: 有三個屬性,Id,Name,Sex。一個欄位Status,還有一個方法Show. 嗯~,破費科特。 來看看反射的各個方法或屬性怎麼使用吧! 獲取類型的公用屬性的方法(GetProperties) 輸出結果為: 是不 ...
  • 用DataTables時併發訪問量較大,單個任務操作(獲取數據)時間較長。連接數過多的時候就出現InvalidOpertionException錯誤。知道哪裡有問題那就好辦了,對GetDataTable(string sql):DataTable方法用線程鎖 lock() ,這樣就不會出現上述問題。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...