ASP.NET Core 入門教程 7、ASP.NET Core MVC 分部視圖入門

一抹凳、前言

1鸯匹、本教程主要內(nèi)容

  • ASP.NET Core MVC (Razor)分部視圖簡介
  • ASP.NET Core MVC (Razor)分部視圖基礎(chǔ)教程
  • ASP.NET Core MVC (Razor)強類型分部視圖教程

2、本教程環(huán)境信息

軟件/環(huán)境 說明
操作系統(tǒng) Windows 10
SDK 2.1.401
ASP.NET Core 2.1.3
IDE Visual Studio Code 1.30
瀏覽器 Chrome 70

本篇代碼以下代碼進行調(diào)整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-06

3灾搏、準(zhǔn)備工作

VS Code 本身不提供 ASP.NET Core MVC 視圖引擎(Razor)的智能感知挫望。
幸運的是,VS Code C#擴展 從 1.17.0 版本開始支持Razor視圖引擎的智能感知狂窑。

所以媳板,我們要將VS Code C#擴展升級到最新版本。

另外泉哈,要特意說明的是蛉幸,在VS Code 1.30版本,解決方案(Solution)視圖的視圖入口改到了側(cè)邊工具欄

image

二丛晦、ASP.NET Core MVC (Razor)分部視圖簡介

1奕纫、Razor分部視圖概述

在Razor視圖引擎中,我們可以定義.cshtml文件作為“視圖”來渲染需要呈現(xiàn)給用戶的內(nèi)容烫沙。對于所有頁面共用的部分匹层,我們可以定義母版頁(Layout)讓視圖繼承共用的部分。當(dāng)有些公共的部分我們只在某些頁面用到锌蓄,不需要每個頁面都用到升筏〕湃幔或者這個公共的內(nèi)容需要作為模板使用多次,母版頁就不適合承擔(dān)這樣的作用您访。這時候我們可以使用分部視圖來實現(xiàn)铅忿。

2、Razor分部視圖定義與引用

Razor分部視圖定義

視圖與分部視圖在定義上并沒有本質(zhì)的不同洋只,均是創(chuàng)建.cshtml文件作為視圖使用,只是在渲染的時候作為分部視圖來渲染/加載昼捍。

在之前提到過识虚,通常公共的Razor視圖文件名都以_開頭并放在/Views/Shared文件夾中,分部視圖也不例外妒茬。

例如:/Views/Shared/_PartialViewTest.cshtml

如果分部視圖只在某個控制器返回的視圖中引用担锤,也可以創(chuàng)建在該控制器對應(yīng)的視圖目錄。

例如:/Views/Home/_PartialViewTest.cshtml

Razor分部視圖引用

//同步引用

@Html.Partial("_PartialViewTest")


//異步引用(官方推薦)

@await Html.PartialAsync("_PartialViewTest")

微軟官方更推薦使用異步加載的方式乍钻,因為同步加載可能會出現(xiàn)程序死鎖的情況

如果沒有使用異步方式肛循,會收到編譯器警告:warning MVC1000: Use of IHtmlHelper.Partial may result in application deadlocks. Consider using <partial> Tag Helper or IHtmlHelper.PartialAsync.

如果你非常在意性能,也可以使用 Html.RenderPartialAsync 呈現(xiàn)分部視圖银择。 這種方式會直接呈現(xiàn)分部視圖的內(nèi)容多糠,而不會組裝成 IHtmlContent 對象放回。

@{
    await Html.RenderPartialAsync("_PartialViewTest");
}

由于 Html.RenderPartialAsync并不會返回任何內(nèi)容浩考,所以需要在Razor語句塊中調(diào)用

Razor分部視圖查找順序同視圖相同:

  • Views/[ControllerName]/[PartialViewName].cshtml
  • Views/Shared/[PartialViewName].cshtml

當(dāng)然夹孔,你也可以直接指定完整路徑,例如:

@await Html.PartialAsync("/Views/Home/_PartialViewTest.cshtml")

三析孽、 Razor分部視圖基礎(chǔ)使用

1搭伤、定義分部視圖

/Views/Shared目錄下創(chuàng)建視圖 '_DateTimeInfo.cshtml'

當(dāng)前時間:@DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") 
當(dāng)前星期:@DateTime.Now.DayOfWeek

2、創(chuàng)建視圖并引用分部視圖

/Views目錄下創(chuàng)建目錄Partial袜瞬,并在/Views/Partial 目錄下創(chuàng)建文件 Demo.cshtml

@{
    ViewBag.Title = "PartialView Demo";
}
<h3>@ViewBag.Title</h3>
<p>PartialView Demo by ken.io</p>

@Html.Partial("_DateTimeInfo")

<hr/>

@await Html.PartialAsync("_DateTimeInfo")

3怜俐、創(chuàng)建控制器

/Controllers 目錄下創(chuàng)建PartialController.cs并創(chuàng)建對應(yīng)Action

using System;
using Microsoft.AspNetCore.Mvc;

namespace Ken.Tutorial.Web.Controllers
{
    public class PartialController : Controller
    {
        public IActionResult Demo()
        {
            return View();
        }
    }
}

4、訪問測試

啟動項目邓尤,訪問 /partial/demo 拍鲤,將會看到

image

四、帶參數(shù)的Razor分部視圖

1汞扎、視圖對象準(zhǔn)備

在項目根目錄中創(chuàng)建模型目錄Models殿漠,并在下面創(chuàng)建對象NoteViewModel.cs

using System;

namespace Ken.Tutorial.Web.Models
{
    public class NoteViewModel
    {
        public string Title { get; set; }

        public DateTime PublishTime { get; set; }

        public string Body { get; set; }
    }
}

2、定義分部視圖

/Views/Shared目錄下創(chuàng)建視圖 '_NoteInfo.cshtml'

@model Ken.Tutorial.Web.Models.NoteViewModel;

<h3>@Model.Title</h3>
<span>@Model.PublishTime.ToString("yyyy-MM-dd")</span>
<p>@Model.Body</p>

實際上就是創(chuàng)建強類型分部視圖:-D

3佩捞、創(chuàng)建視圖并引用分部視圖

/Views/Partial 目錄下創(chuàng)建文件 DemoWithParams.cshtml

@using Ken.Tutorial.Web.Models;
@{
    ViewBag.Title = "PartialView With Params Demo";
}
<h3>@ViewBag.Title</h3>
<p>PartialView With Params Demo by ken.io</p>

@await Html.PartialAsync("_NoteInfo", new NoteViewModel() { Title = "這是一個分部視圖測試筆記", PublishTime = DateTime.Now, Body = "這是筆記的內(nèi)容"  })

4绞幌、在控制器中編寫對應(yīng)Action

在控制器 PartialController.cs 中增加以下 Action:

public IActionResult DemoWithParams()
{
    return View();
}

5、訪問測試

啟動項目一忱,訪問 /partial/demowithparams 莲蜘,將會看到

image

如果是文章列表頁谭确,用起來會顯得更方便。

五票渠、備注

1逐哈、附錄

  • 本文代碼示例

https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-07

  • 本文參考

https://docs.microsoft.com/zh-cn/aspnet/core/mvc/views/partial?view=aspnetcore-2.1


本文首發(fā)于我的獨立博客:https://ken.io/note/asp.net-core-tutorial-mvc-view-partial

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市问顷,隨后出現(xiàn)的幾起案子昂秃,更是在濱河造成了極大的恐慌,老刑警劉巖杜窄,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肠骆,死亡現(xiàn)場離奇詭異,居然都是意外死亡塞耕,警方通過查閱死者的電腦和手機蚀腿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扫外,“玉大人莉钙,你說我怎么就攤上這事∩秆瑁” “怎么了磁玉?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驾讲。 經(jīng)常有香客問我蜀涨,道長,這世上最難降的妖魔是什么蝎毡? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任厚柳,我火速辦了婚禮,結(jié)果婚禮上沐兵,老公的妹妹穿的比我還像新娘别垮。我一直安慰自己,他們只是感情好扎谎,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布碳想。 她就那樣靜靜地躺著,像睡著了一般毁靶。 火紅的嫁衣襯著肌膚如雪胧奔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天预吆,我揣著相機與錄音龙填,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛岩遗,可吹牛的內(nèi)容都是我干的扇商。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼宿礁,長吁一口氣:“原來是場噩夢啊……” “哼案铺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梆靖,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤控汉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后返吻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姑子,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年思喊,在試婚紗的時候發(fā)現(xiàn)自己被綠了壁酬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片次酌。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡恨课,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岳服,到底是詐尸還是另有隱情剂公,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布吊宋,位于F島的核電站纲辽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏璃搜。R本人自食惡果不足惜拖吼,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望这吻。 院中可真熱鬧吊档,春花似錦、人聲如沸唾糯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽移怯。三九已至香璃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舟误,已是汗流浹背葡秒。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人同云。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓糖权,卻偏偏與公主長得像,于是被迫代替她去往敵國和親炸站。 傳聞我的和親對象是個殘疾皇子星澳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容