asp.net core mvc View Component 應用

来源:http://www.cnblogs.com/netcoder/archive/2017/09/11/7503876.html
-Advertisement-
Play Games

ViewComponent 1、View 組件介紹 在ASP.NET CORE MVC中,View組件有點類似於partial views,但是他們更強大,View組件不能使用model binding,當你調用它的時候僅僅依賴與你提供的數據一個View組件特點: .呈現一大塊而不是一個整體的響應。 ...


ViewComponent


1、View 組件介紹

在ASP.NET CORE MVC中,View組件有點類似於partial views,但是他們更強大,View組件不能使用model binding,當你調用它的時候僅僅依賴與你提供的數據
一個View組件特點:

   .呈現一大塊而不是一個整體的響應。
   .包含在控制器和視圖之間發現的相同的分離問題和可測試行優點。
   .可以包含參數和業務邏輯。
   .通常從佈局頁面調用。

你可以在任何可重覆使用的渲染邏輯的部分視圖中用視圖組件來替換。

例如:

   .動態導航菜單

   .標簽雲

   .登陸面板

   .購物車

   .最近發表的文章

   .側欄內容在一個典型的博客

   .登陸的面板信息可以顯示在每一個頁面上,並顯示要註銷或登陸的鏈接,具體取決於用戶的登陸狀態

   視圖組件有兩部分組成:類(通常派生自ViewComponent)和返回結果(通常為視圖). 像控制器
   一樣,視圖組件可以是POCO,但大多數開發人員都希望利用從ViewComponent派生的方法和屬性

 

2、創建一個View組件

本節包含創建一個視圖組件。在本文的後面,我們將詳細檢查每個步驟並創建一個視圖組件。

 2.1 、View Component類

   一個View組件的類可以通過下麵方式創建:

   .繼承ViewComponent
   .使用[ViewComponent]attribute 修飾的類,或者繼承自一個[ViewComponent]attribute類的子類。
   .創建一個以ViewComponent結尾的類。

   像控制器一樣,View組件必須是公共的、非嵌套的,和非抽象類。視圖組件名稱是刪除"ViewComponent" 尾碼的類名稱。
   也可以使用ViewComponentAttribute.Name屬性顯式指定它。


2.2、View Component 類

      .支持構造函數註入
      .不參與控制器的生命周期,這意味著你不能在視圖組件中使用過濾器

2.3、View Component方法

      視圖組件在InvokeAsync方法中定義其邏輯,該方法返回IViewComponentResult.調用視圖組件直接用參數,而不是模型
綁定。視圖組件從不直接處理請求。通常,視圖組件初始化模型,並通過調用View方法將其傳遞給視圖。

   總是來說,視圖組件方法如下:

   .定義一個InvokeAsync 方法返回一個IViewComponentResult
   .通常,通過調用ViewComponent View方法來初始化模型並將其傳給視圖。
   .參數來自調用方法,而不是HTTP,沒有模型綁定
   .不能直接作為HTTP端點訪問,他們是通過代碼調用(通常在視圖中)。視圖組件從不處理請求。
   .在簽名上重裝,而不是來自當前HTTP請求的任何詳細信息

2.4、View 搜索路徑

   運行時View通過搜索下列路徑:

   .Views/<controller_name>/Components/<view_component_name>/<view_name>

   .Views/Shared/Components/<view_component_name>/<view_name>

   創建視圖組件結果或調用VIew方法時,可以指定不同的視圖名稱。

   我們建議你為視圖文件命名為Default.cshtml,並使用Views/Shared/Components/<view_component_name>/<view_name>路徑

   此示例中使用的PriorityList視圖組件使用Views/Shared/Components/PriorityList/Default.cshtml作為視圖組件視圖。

   一個視圖組件預設的名稱是Default.cshtml 並且使用Views/Shared/Components/<view_component_name>/<view_name> 路徑.
  
   在這個例子中我們使用PriorityList視圖組件Views/Shared/Components/PriorityList/Default.cshtml

2.4、調用一個視圖組件
  
   在View視圖內通過如下調用視圖組件:

   @Component.InvokeAsync("Name of view component", <anonymous type containing parameters>)

   參數將傳遞給InvokeAsync方法。在文章中開發的PriorityList視圖組件是從Views/Todo/Index.cshtml視圖中調用的。

   在下麵,InvokeAsync方法調用兩個參數:

   @await Component.InvokeAsync("PriorityList", new { maxPriority = 4, isDone = true })

  通過Tag Helper調用視圖組件:

  對於asp.net core 1.1和更高版本,你可以作為tagHelper調用一個視圖組件。

  <vc:priority-list max-priority="2" is-done="false">
  </vc:priority-list>

   上面代碼中,PriorityList視圖組件被轉化成priority-list.視圖組件的參被轉化成小寫短橫線屬性。

  調用視圖組件的標簽助手使用<vc> </ vc>元素。 視圖組件指定如下:

  <vc:[view-component-name]
  parameter1="parameter1 value"
  parameter2="parameter2 value">
  </vc:[view-component-name]>

  註意: 為了使用View Component作為Tag Helper,必須使用@addTagHelper指令註冊包含View Component的程式集。例如,

如果你的View Component位於名為"MyWebApp"的程式集,請將以下指令添加到_ViewImports.cshtml文件中:

  @addTagHelper *, MyWebApp

  本教程中使用的InvokeAsync方法:

   @await Component.InvokeAsync("PriorityList", new { maxPriority = 4, isDone = true })
 
   標簽助手標記

   <vc:priority-list max-priority="2" is-done="false">
   </vc:priority-list>
  
  在上面的示例中,PriorityList視圖組件成為priority-list。


  在Controller中直接調用一個組件

  視圖組件通常從視圖調用,但您可以直接從控制器方法調用他們。雖然視圖組件不定義端點(如控制器),但你可以輕鬆
  實現返回ViewComponentResult內容的控制器操作。

   下麵代碼,View 組件直接通過控制器調用:

   public IActionResult IndexVC()
   {
     return ViewComponent("PriorityList", new { maxPriority = 3, isDone = false });
   }

2.5、創建一個ViewComponent

  在代碼中註意如下幾點:

    .View Component 類能包含到項目任何目錄下.

    .因為類名PriorityListViewComponent以ViewComponent結尾,運行時使用字元串"PriorityList"

    稍後將會做詳細解釋.

    .[ViewComponent]能改變名字引用一個ViewComponent。例如,我們可以命名XYZ類,並應用ViewComponent attribute
   
        [ViewComponent(Name = "PriorityList")]
        public class XYZ : ViewComponent{}

    .上面的[ViewComponent]特性告訴ViewComponent選擇器使用名稱為PriorityList 當視圖查找相關聯的組件時。

      並從視圖引用類的組件時使用字元串"PriorityList"

    .組件使用了依賴註入,確保數據上下文是可用的。

    .InvokeAsync是公開的方法可以直接從視圖中調用,它可以傳入任意數量的參數。

    .InvokeAsync方法返回滿足isDone和maxPriority參數的ToDo項集合

2.6、創建視圖組件 Razor View

    .創建Views/Shared/Components 文件夾.這個文件夾的名字必須是Components。

    .創建Views/Shared/Components/PriorityList 文件夾,這個文件夾名稱必須和ViewComponent類名稱相同,或者類名減去尾碼

     如果你使用了ViewComponet屬性,則類名必須匹配該屬性.
   
    .創建一個 Views/Shared/Components/PriorityList/Default.cshtml Razor view:


     @model IEnumerable<ViewComponentSample.Models.TodoItem>

    <h3>Priority Items</h3> 
   <ul>
    @foreach (var todo in Model)
    {
        <li>@todo.Name</li>
    }
    </ul> 

     Razor View 返回一個列表並顯示他們.如果這個View Component 的InvokeAsync方法沒有傳遞一個View的名字,根據契約Default視圖名字將被使用。
     在稍後我們將介紹如何傳遞一個視圖的名字, 要覆蓋特定控制器的預設樣式,請將視圖添加到特定於控制器的視圖文件夾(例如Views / Todo / Components / PriorityList / Default.cshtml)。
     將包含調用優先順序列表組件的div添加到Views/Todo/index.cshtml文件的底部:

     <div >
      @await Component.InvokeAsync("PriorityList", new { maxPriority = 2, isDone = false })
     </div>  

      @await Component.InvokeAsync 展示瞭如何調用ViewComponent語法.第一個參數是我們想要調用視圖組件的名稱。後續參數傳給組件,
      InvokeAsync可以接受任意數量的參數可以接受任何數量的參數。


      你也可以通過Controller直接調用。

       public IActionResult IndexVC()
       {
          return ViewComponent("PriorityList", new { maxPriority = 3, isDone = false });
       }
指定一個View名稱

     複雜的視圖組件有時候可能需要指定一些非預設視圖。下麵代碼顯示瞭如何從InvokeAsync方法中指定PVC視圖。

更新PriorityListViewComponent類中的InvokeAsync方法。

   public async Task<IViewComponentResult> InvokeAsync(

 int maxPriority, bool isDone)
{
    string MyView = "Default";
    // If asking for all completed tasks, render with the "PVC" view.
    if (maxPriority > 3 && isDone == true)
    {
        MyView = "PVC";
    }
    var items = await GetItemsAsync(maxPriority, isDone);
    return View(MyView, items);
}

 

     複製Views/Shared/Components/PriorityList/Default.cshtml文件,重命名為Views/Shared/Components/PriorityList/PVC.cshtml    
    

     在PVC.cshtml中添加下麵代碼:

    @{
       ViewData["Title"] = "Default";
       }
    @model IEnumerable<ViewComponentSimple.ViewComponents.TodoItem>

    <h3>To do PVC View</h3>

   <ul>
      @foreach (var todo in Model)
       {
          <li>@todo.Name</li>
       }
    </ul>

     運行應用程式,並驗證PVC視圖。

 


檢查視圖路徑

     .將priority參數更改0,以便不返回PVC視圖。
     .臨時將Views/Todo/Components/PriorityList/Default.cshtml重命名為1Default.cshtml。

     .運行App你會得到下麵錯誤:   
    

 

     .複製 Views/Todo/Components/PriorityList/1Default.cshtml 到 Views/Shared/Components/PriorityList/Default.cshtml.

     .向共用視圖中添加一些標記,以指示視圖來自共用文件。

     .測試共用文件中視圖組件.

如果你想確保編譯時類型安全,你可以用類名去替換硬編碼(不用字元串).創建一個View視圖不適用"ViewComponent" 尾碼

 

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ViewComponentSample.Models;

namespace ViewComponentSample.ViewComponents
{
    public class PriorityList : ViewComponent
    {
        private readonly ToDoContext db;

        public PriorityList(ToDoContext context)
        {
            db = context;
        }

        public async Task<IViewComponentResult> InvokeAsync(
        int maxPriority, bool isDone)
        {
            var items = await GetItemsAsync(maxPriority, isDone);
            return View(items);
        }
        private Task<List<TodoItem>> GetItemsAsync(int maxPriority, bool isDone)
        {
            return db.ToDo.Where(x => x.IsDone == isDone &&
                                 x.Priority <= maxPriority).ToListAsync();
        }
    }
}

使用nameof操作符:

@using ViewComponentSample.Models
@using ViewComponentSample.ViewComponents
@model IEnumerable<TodoItem>

<h2>ToDo nameof</h2>
<!-- Markup removed for brevity.  -->
    }
</table>

<div>

    @await Component.InvokeAsync(nameof(PriorityList), new { maxPriority = 4, isDone = true })
</div>

 

原文:https://docs.microsoft.com/zh-cn/aspnet/core/mvc/views/view-components

 

 

 


  

 


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

-Advertisement-
Play Games
更多相關文章
  • 前言:網路路由不管是平常在家裡,還是在公司中,都是必需配置的,所以還是非常重要的,今天小編就給大家做個配置網路路由配置的小實驗,僅供大家參考。 一、首先,來簡單介紹一下網路路由。 1. 網路路由:將網路連接起來並將網路信息導向其他網路上,通常網路信息全自動尋找多個路由器,並選擇效率最高的路由。 網路 ...
  • Linux基礎知識與基礎命令 系統目錄 Linux只有一個根目錄,沒有盤符的概念,文件目錄是一個倒立的樹形結構。 常用的目錄功能 bin 與程式相關的文件 boot 與系統啟動相關 cdrom 與Linux的外設如光碟相關 dev 與設備相關 etc 與相關幾乎所有伺服器以及軟體的配置相關文件 li ...
  • 第一部分Mem行: total 記憶體總數: 1002M used 已經使用的記憶體數: 769M free 空閑的記憶體數: 232M shared 當前已經廢棄不用,總是0 buffers Buffer 緩存記憶體數: 62M cached Page 緩存記憶體數:421M 關係:total(1002M) ...
  • 一、應用練習 1.需求練習 編寫登陸介面 要求: 讓用戶輸入用戶名密碼 認證成功後顯示歡迎信息 輸錯三次後退出程式 #!/usr/bin/env python #coding:utf-8 time=0 data={ 'zhangsan':{'ps':'zs123'}, 'lisi':{'ps':'l ...
  • 多路復用的適用場合 • 當客戶處理多個描述符時(例如同時處理互動式輸入和網路套介面),必須使用I/O復用。 • 如果一個TCP伺服器既要處理監聽套介面,又要處理已連接套介面,一般也要用到I/O復用。 • 如果一個伺服器即要處理TCP,又要處理UDP,一般要使用I/O復用。 • 如果一個伺服器要處理多 ...
  • protected void ByteToString_Click(object sender, EventArgs e) { string content = this.txtContent.Text.ToString(); if (string.IsNullOrEmpty(content)) { ...
  • 環境: Windows 10,Visual Studio 2017 centos 7,nginx,supervisor,dotnet core 1.1 問題: 在 Linux 配置 supervisor 時,如下命令運行項目會出現各種路徑問題,可能涉及一個 work dir 的概念;Windows ...
  • 平時還是比較喜歡看書的。。但有時候遇到問題還是經常感到腦袋一蒙。。智商果然是硬傷。。 同事發現了個問題,代碼如下: 在使用HttpClient的GetAsync請求後阻塞查詢.Result“死鎖了”,我們知道GetAsync內部也是一個後臺線程在執行,直到獲取到結果時會調用Task中的SetResu ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...