asp.net core系列 42 Web 應用 分部視圖

来源:https://www.cnblogs.com/MrHSR/archive/2019/03/14/10525099.html
-Advertisement-
Play Games

一.分部視圖 對於MVC 視圖和 Razor Pages 頁面,都有分部視圖功能。通常將 MVC 視圖和 Razor Pages 頁面統稱為“標記文件”,下麵會常提到該名詞。使用分部視圖的優勢包括:(1) 將大型標記文件分解為更小的組件。(2) 減少跨標記文件中,常見標記內容的重覆。 建議:(1)不 ...


一.分部視圖

  對於MVC 視圖和 Razor Pages 頁面,都有分部視圖功能。通常將 MVC 視圖和 Razor Pages 頁面統稱為“標記文件”,下麵會常提到該名詞。使用分部視圖的優勢包括:(1) 將大型標記文件分解為更小的組件。(2) 減少跨標記文件中,常見標記內容的重覆。

  建議:(1)不應使用分部視圖來維護常見佈局元素,常見佈局元素應在 _Layout.cshtml 文件中指定,比如頁頭、頁尾。(2)當需要呈現複雜邏輯或代碼執行的應該使用視圖組件。

 

  1.1 聲明分部視圖

    分部視圖是在 Views 文件夾 (MVC) 或 Pages 文件夾 (Razor Pages) 中維護的 .cshtml 標記文件。在 ASP.NET Core MVC 中,控制器的 ViewResult 能夠返回視圖或分部視圖。 在 ASP.NET Core 2.2 中 Razor Pages 的PageModel 可以返回 PartialViewResult分部視圖。

    分部視圖不會運行 _ViewStart.cshtml頁,這涉及到佈局以後再講。分部視圖的文件名通常以下劃線 _ 開頭,沒有.cshtml.cs文件。

    

  1.2 引用分部視圖

    在標記文件中,有多種方法可引用分部視圖。 建議應用程式使用以下非同步呈現方法之一:(1) 分部標記幫助程式。(2) 非同步 HTML 幫助程式。 不建議使用同步HTML 幫助程式, 因為可能會出現死鎖的情況, 同步方法以後版本中會刪除,這裡不再介紹。

 

    (1) 分部標記幫助程式

      分部標記幫助程式會非同步呈現內容,並使用類似 HTML 的語法:

        <partial name="_PartialName" />

      當存在文件擴展名時,標記幫助程式會引用分部視圖,該視圖必須與調用分部視圖的標記文件位於同一文件夾中:   

      <partial name="_PartialName.cshtml" />

      以下示例從應用程式根目錄引用分部視圖。 以 (~/) 或 (/) 開頭的路徑,指代應用程式根目錄:

        Razor 頁面CSHTML
        <partial name="~/Pages/Folder/_PartialName.cshtml" />
         <partial name="/Pages/Folder/_PartialName.cshtml" />
        MVC  CSHTML
        <partial name="~/Views/Folder/_PartialName.cshtml" />
        <partial name="/Views/Folder/_PartialName.cshtml" />
      使用相對路徑的分部視圖
      <partial name="../Account/_PartialName.cshtml" />

    

    (2) 非同步 HTML 幫助程式

      使用 HTML 幫助程式時,最佳做法是使用 PartialAsync,同步是使用Partial(不建議使用同步)。PartialAsync 返回包含在 Task<TResult> 中的 IHtmlContent 類型。通過@await來引用該方法。

Razor 頁面CSHTML
@await Html.PartialAsync("~/Pages/Folder/_PartialName.cshtml")
@await Html.PartialAsync("/Pages/Folder/_PartialName.cshtml")
mvc CSHTML
@await Html.PartialAsync("~/Views/Folder/_PartialName.cshtml")
@await Html.PartialAsync("/Views/Folder/_PartialName.cshtml")

      也可以使用 RenderPartialAsync 呈現分部視圖。 此方法不返回 IHtmlContent。它將呈現的輸出,直接流式傳輸到響應, 因此在某些情況下它可提供更好的性能。 因為該方法不返回結果,所以必須在 Razor 代碼塊內調用它:

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

 

  1.3 分部視圖發現

    如果按名稱(無文件擴展名)引用分部視圖,則按所述順序搜索以下位置:

         (1) Razor 頁面

                  1.當前正在執行頁面的文件夾

                  2.該頁面文件夾上方的目錄圖

                  3./Shared

                  4./Pages/Shared

                  5./Views/Shared

           (2) MVC

                   1./Areas/<Area-Name>/Views/<Controller-Name>

                   2./Areas/<Area-Name>/Views/Shared

                   3./Views/Shared

                   4./Pages/Shared

      

  1.4 通過分部視圖訪問數據

    實例化分部視圖時,它會獲得父視圖(主視圖)的 ViewData 字典的副本。 在分部視圖內,對數據所做的更新不會保存到父視圖中 對分部視圖中的 ViewData 更改,會在分部視圖返回時丟失。

    以下示例演示如何將 ViewDataDictionary(ViewData 字典)的實例傳遞給分部視圖:

    @await Html.PartialAsync("_PartialName", customViewData)

    還可將模型(實體對象)傳入分部視圖。 模型可以是自定義對象。

    @await Html.PartialAsync("_PartialName", model)

    

二. 演示

  下麵演示一個Razor的分部視圖(MVC的參考官網示例)。示例中Pages/ArticlesRP/ReadRP.cshtml是主視圖,Pages/Shared/_AuthorPartialRP.cshtml是第一個分部視圖,傳入“作者”。Pages/ArticlesRP/_ArticleSectionRP.cshtml 是第二個分部視圖,傳入ViewData字典和section模型二個參數,這二個參數是PartialAsync的方法重載。 三個文件結構如下:

  (1) 創建實體類

   public class Article
    {
        public string Title { get; set; }

        public string AuthorName { get; set; }

        public string PublicationDate { get; set; }

        public List<ArticleSection> Sections { get; set; }
    }

    public class ArticleSection
    {
        public string Title { get; set; }
        public string Content { get; set; }
    }

  (2)主視圖

    public class ReadRPModel : PageModel
    {
        public Article Article { get; set; }

        public void OnGet()
        {
            Article = new Article()
            {
                Title = "來自 <共用分部視圖文件路徑> 的分部視圖",
                AuthorName = "Abraham Lincoln",
                PublicationDate= "1863 年 11 月 19 日中午 12:00:00",
                Sections = new List<ArticleSection>() {
                         new ArticleSection (){ Title="第一節索引", Content="八十七年前..." },
                         new ArticleSection (){ Title="第二節索引", Content="如今,我們正在進行一場偉大的內戰,考驗著......" },
                         new ArticleSection (){ Title="第三節索引", Content="然而,從更廣泛的意義上說,我們無法奉獻..." },
                }
            };
        }
    }
@page
@model ReadRPModel

<h2>@Model.Article.Title</h2>

@Model.Article.PublicationDate

@* 將作者名字傳到 Pages\Shared\_AuthorPartialRP.cshtml*@
<p>---------------------------------第一個分部視圖/Views/Shared/_AuthorPartial.cshtml</p>
@await Html.PartialAsync("../Shared/_AuthorPartialRP.cshtml", Model.Article.AuthorName)


<p></p>
@*  Loop over the Sections and pass in a section and additional ViewData to
    the strongly typed Pages\ArticlesRP\_ArticleSectionRP.cshtml partial view. *@
<p>---------------------------------第二個分部視圖/Views/Shared/_ArticleSection.cshtml</p>
@{
    var index = 0;

    @foreach (var section in Model.Article.Sections)
    {
        @await Html.PartialAsync("_ArticleSectionRP", section,
                                 new ViewDataDictionary(ViewData)
                                 {
                                     { "index", index }
                                 })

        index++;
    }
}

  (3) 分部視圖 _AuthorPartialRP.cshtm

@* 將傳過來的string類型映射*@
@model string
<div>
    <h3>@Model</h3>
</div>

   (4) 分部視圖 _ArticleSectionRP.cshtml 

@using StudyRazorDemo.Models;

@* 將傳過來的對象映射到ArticleSection中*@
@model ArticleSection

<h3>@Model.Title Index: @ViewData["index"]</h3>
<div>
    @Model.Content
</div>
<p></p>

   

  啟動程式,運行http://localhost:42921/ArticlesRP/ReadRP,顯示如下:

 

  參考資料

    ASP.NET Core 中的分部視圖

   


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

-Advertisement-
Play Games
更多相關文章
  • 一般而言webservice是部署在哪台伺服器,然後它的address location就是指向哪個,但是由於有些情況處於各種原因,如網路策略,需要先訪問某個ip之後再進行跳轉到一個ip,這個時候就需要代碼控制websevice指向的IP地址了,就需要用到SoapExtensionReflector ...
  • 裝箱:值類型-->引用類型。 拆箱:引用類型-->值類型 裝箱:把值類型拷貝一份到堆里。反之拆箱。 具有父子關係 是拆裝箱的條件之一。 所以: 裝的什麼類型,拆的時候也必須是對應類型。 使用方法時看是否裝拆箱:看需要的參數和傳入的參數的集體類型。 使用泛型集合避免裝拆箱。 ...
  • MVC頁面擴展方法 單例模式 /// <summary> /// 創建一個Config內容對象 /// </summary> /// <param name=""></param> /// <param name="key"></param> /// <returns></returns> publ ...
  • 今天給大家帶來的討論主題是通過實戰經驗來對百億數據量下的多表數據查詢進行優化,俗話說的好,一切脫離業務的架構都是耍流氓,接下來我就整理一下今天早上微信群里石頭哥給大家分享的百億數據量多表查詢架構以及優化思路。由於本文內容整理自微信群,爬樓不易,整理更不易,如果有遺漏,歡迎大家在評論區留言。 作者:依 ...
  • 之前在隨筆《在Winform開發中使用Grid++報表》介紹了在Winform環境中使用Grid++報表控制項,本篇隨筆介紹在Boostrap開發框架中使用Grid++報表,也就是Web環境中使用Grid++報表,對於我上篇提到的二維碼條形碼的資產信息表,我系統通過Web方式進行呈現,或者展示其報表的... ...
  • 本文章是介紹和記錄如何創建GraphQL項目,以及如何使用GraphQL進行數據的相關操作。項目參照GraphQL .Net 的官方文檔進行實踐 一、項目結構: 為了更好的和原有的項目結合在一起,儘可能減少對原項目的修改。我對項目結構做瞭如下分層。 二、項目結構分層說明 Contracts層: 項目 ...
  • 1. ODBC、OLEDB、ADO、ADO.NET之間的關係 ODBC: 開放資料庫互連(ODBC)是MICROSOFT提出的資料庫訪問介面標準。ODBC(Open DatabaseConnectivity,開放資料庫互連)提供了一種標準的API(應用程式編程介面)方法來訪問資料庫管理系統(DBMS ...
  • 集合命名空間: using system.collections. 非泛型集合 using system.collections.Generic. 泛型集合 為什麼要用集合: 1、數組一旦聲明長度就固定了。 2、集合有很多方法可以用 等 常用集合: 類似數組集合:ArrayList List<> 鍵 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...