.Net Core使用視圖組件(ViewComponent)封裝表單文本框控制項

来源:https://www.cnblogs.com/fengye310/archive/2019/02/23/10374576.html
-Advertisement-
Play Games

實常式序的界面效果如下圖所示: 在表單中的搜索條件有姓名,學號,成績。他們在一行中按照水平三等分排列。 在cshtml中用html實現上述表單效果的的代碼如下: 1 <form class="form-horizontal" role="form"> 2 <div class="row"> 3 <d ...


實常式序的界面效果如下圖所示:

在表單中的搜索條件有姓名,學號,成績。他們在一行中按照水平三等分排列。

在cshtml中用html實現上述表單效果的的代碼如下:

 1 <form class="form-horizontal" role="form">
 2     <div class="row">
 3         <div class="form-group col-md-4">
 4             <label for="name" class="col-md-2 control-label">姓名</label>
 5             <div class="col-md-10">
 6                 <input type="text" class="form-control" id="name" placeholder="請輸姓名">
 7             </div>
 8         </div>
 9         <div class="form-group col-md-4">
10             <label for="name" class="col-md-2 control-label">學號</label>
11             <div class="col-md-10">
12                 <input type="text" class="form-control" id="name" placeholder="請輸學號">
13             </div>
14         </div>
15         <div class="form-group col-md-4">
16             <label for="name" class="col-md-2 control-label">成績</label>
17             <div class="col-md-10">
18                 <input type="text" class="form-control" id="name" placeholder="請輸成績">
19             </div>
20         </div>
21     </div>
22     <button type="submit" class="btn btn-default">搜索</button>
23 </form>
View Code

 通過觀察上述代碼發現,搜索條件按照水平三等分排列會產生如下圖紅線標記的冗餘代碼:

通過截圖可以看出,是否可以把這個div塊封裝成一個控制項,這樣就不用重覆寫樣式屬性,在使用時就只給lable,input控制項根據實際情況賦予其相應的屬性。

在.Net Core中視圖組件(ViewComponent)可以完成這一功能。視圖組件類似於部分視圖,但是它們更強大。視圖組件不使用模型綁定,只依賴於調用時提供的數據。

微軟的官方幫助文檔地址為:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components?view=aspnetcore-2.2

創建視圖組件(ViewComponent)

1.在解決方案根目錄下創建ViewComponents文件夾,

   在ViewComponents文件夾下在添加子文件夾InputLabelTextBox,

   InputLabelTextBox文件夾下分別添加l類InputLabelTextBoxViewComponent.cs和InputLabelTextBoxViewModel.cs 結果如下圖所示:

  

 

InputLabelTextBoxViewComponent.cs為視圖組件類

 1     public class InputLabelTextBoxViewComponent : ViewComponent
 2     {
 3         public IViewComponentResult Invoke(string labelText, string inputId,
 4             string placehodler, string viewName)
 5         {
 6             //沒有指定視圖名稱,預設使用Default.cshtml
 7             if (string.IsNullOrEmpty(viewName))
 8             {
 9                 viewName = "Default";
10             }
11             var fortmatDataViewModel = new InputLabelTextBoxViewModel(labelText, inputId, placehodler, viewName);
12             return View(viewName, fortmatDataViewModel);
13         }
14     }
View Code

 InputLabelTextBoxViewModel.cs為視圖組件中所用到的屬性類,

 

 1     public class InputLabelTextBoxViewModel
 2     {
 3         /// <summary>
 4         /// Label控制項的文本
 5         /// </summary>
 6         public string LabelText { get; set; }
 7 
 8         /// <summary>
 9         /// Input控制項的Id
10         /// </summary>
11         public string InputId { get; set; }
12 
13         /// <summary>
14         /// Input控制項的水印
15         /// </summary>
16         public string Placeholder { get; set; }
17 
18         /// <summary>
19         /// 視圖名稱
20         /// </summary>
21         public string ViewName { get; set; }
22 
23         public InputLabelTextBoxViewModel(string labelText, string inputId, string placeholder, string viewName)
24         {
25             LabelText = string.IsNullOrEmpty(labelText) ? "" : labelText;
26             InputId = string.IsNullOrEmpty(inputId) ? "" : inputId;
27             Placeholder = string.IsNullOrEmpty(placeholder) ? "" : placeholder;
28             ViewName = string.IsNullOrEmpty(viewName) ? "" : viewName;
29         }
30     }
View Code

 

2.在解決方案的Views文件夾下的Shared文件夾中添加Components子文件夾,

   在Components文件夾下在添加其子文件夾InputLabelTextBox,

   在文件夾中添加Default.cshtml視圖,結果如下圖所示:

Default.cshtml就是InputLabelTextBoxViewComponent.cs在界面上預設對應的視圖。

1 @using TestViewComponent.ViewComponents
2 @model InputLabelTextBoxViewModel
3 
4 <div class="form-group col-md-4">
5     <label for="name" class="col-md-2 control-label">@Model.LabelText</label>
6     <div class="col-md-10">
7         <input type="text" class="form-control" id="@Model.InputId" placeholder="@Model.Placeholder">
8     </div>
9 </div>
View Code

在About.cshtml頁面中引用控制項。

 1 @{
 2     ViewData["Title"] = "About";
 3 }
 4 <!--引入命名空間-->
 5 @using TestViewComponent.ViewComponents
 6 <h2>分佈視圖實例:</h2>
 7 <form class="form-horizontal" role="form">
 8     <div class="row">
 9         <!--使用類型創建-->
10         @await Component.InvokeAsync(typeof(InputLabelTextBoxViewComponent), new {
11            LabelText = "姓名",
12            InputId = "InputName",
13            Placeholder = "請輸入姓名...",
14        })
15         <!--InputLabelTextBox為InputLabelTextBoxViewComponent.cs去掉ViewComponent後的名字-->
16         @await Component.InvokeAsync("InputLabelTextBox", new
17        {
18            LabelText = "姓名1",
19            InputId = "InputName1",
20            Placeholder = "請輸入姓名...",
21        })
22     </div>
23 </form>
View Code

 運行後的效果如圖所示:

微軟官方文檔提供了調用視圖組建兩個方法,已經在上述代碼中加以註釋說明。

3.InputLabelTextBoxViewComponent對應多個cshtml頁面

在上述例子中,InputLabelTextBoxViewComponent預設對應於Default.cshtml,現在又想創建第二個視圖對應於InputLabelTextBoxViewComponent該怎麼處理?

首先在InputLabelTextBox文件夾下創建DefaultOne.cshtml頁面。

然後在調用視圖組建時,把InputLabelTextBoxViewModel的ViewName屬性的值賦成DefaultOne,這樣在頁面用引用的控制項就對應於DefaultOne.cshtml。

源代碼下載地址 : https://files-cdn.cnblogs.com/files/fengye310/DotNetCoreDemo.zip


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

-Advertisement-
Play Games
更多相關文章
  • 作為介面的函數頭 C++函數可被其他函數激活或調用,函數頭描述了函數與調用它的函數之間的介面。 在C語言中,省略返回類型相當於說函數的類型為int,然而,C++逐步淘汰了這種用法 也可以使用下麵的變體: int main(void) 在括弧中使用關鍵字void明確地指出,函數不接受任何參數,在C++ ...
  • 原文同步發表至個人博客【夜月歸途】 原文鏈接:http://www.guitu18.com/se/java/2019-02-22/29.html 作者:夜月歸途 出處:http://www.guitu18.com/ 本博客中未標明轉載的文章歸作者夜月歸途和博客園所有。 歡迎轉載,但未經作者同意必須保 ...
  • 73、反向輸出一個鏈表。 74、列表排序及連接。 75、算一道簡單的題目。 76、編寫一個函數,當輸入n為偶數時,調用函數求1/2+1/4+...+1/n,當輸入n為奇數時,調用函數1/1+1/3+...+1/n。 77、迴圈輸出列表。 78、找到年齡最大的人並輸出。 參考資料: Python 10 ...
  • 快速排序可能沒你想的那麼簡單!如何選擇基準?如何快速分區?如何減少數據交換次數?如何使用非遞歸方法? ...
  • MAC homebrew自2018/3/31之後棄用homebrew/php 詳細:https://brew.sh/2018/01/19/homebrew-1.5.0/ 所以不能再用下麵的方法安裝xdebug了,下麵的方法不行!下麵的方法不行!下麵的方法不行! 所以,安裝xdebug我們可以手動編譯 ...
  • package 向家康; import java.util.concurrent.ThreadLocalRandom; public class 練習21 { public static void main(String[] args) { // 隨機一個0--1之間的小數 double n=Mat ...
  • 原創文章,轉載請標註出處: "《Java基礎系列 二進位操作》" 概述 Java源碼中涉及到大量的二進位操作,非常的複雜,但非常的快速。 Java二進位表示法 首先瞭解下二進位,二進位是相對十進位而言的,當然還有八進位,十六進位等等,我們常用的都是十進位,電腦用的都是二進位,而符號表示常用十六進位 ...
  • 1. 查看Nginx的配置文件 命令 nginx -t ,如圖 2. 進入配置文件目錄 並查看目錄 cd /usr/loxa/nginx/conf , 可以看見有一個 nginx.conf文件 一個vhost 目錄 3. 我們先編輯 nginx.conf, 主要的這個 service 這是另一個配置 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...