網站首頁 編程語言 正文
1.什么是標簽助手 Tag Helper
標簽助手是服務端代碼能夠參與在 Razor 文件中創建和呈現HTML元素。例如,內置的 ImageTagHelper 可以將版本號追加到圖像名稱。無論何時更改圖像,服務器都會為圖像生成新的唯一版本,因此可以保證客戶端獲取當前圖像(而不是過時的緩存圖像)。內置的標簽助手多用于常見任務,例如創建表單,鏈接和加載資源等。標簽助手是在 C# 中定義的,它們基于元素名稱,屬性名稱或父標簽來定位HTML元素。例如,當應用 LabelTagHelper 特性時,內置的?LabelTagHelper? 可以減少 Razor 視圖中 HTML和 C# 之間的顯示轉換。
標簽助手與HTML助手的差異:
* 標簽助手提供了一HTML友好的開發體驗
在大多數情況下,使用標簽助手的 Razor 標記看起來像標準的 HTML。如果熟悉 HTML/CSS/Javascript的話,可以直接編輯 Razor,不需要學習C#語法。
* 豐富的IntelliSence 環境,用于創建 HTML 和 Razor 標記
HTML Helper 是此前在 Razor 視圖中服務器端創建標記的方法。IntelliSense 支持 Tag HelpersIntelliSense 解釋環境。即使有 Razor C# 語法經驗的開發人員使用 Tag Helpers ,也比使用 C# Razor 標記更有效率。
還有一種更有效率的方法,并且能夠使用盡在服務器上提供的信息生成更強大,可靠和可維護的代碼。例如,以前更新圖像的時候實在更改圖象時更改圖像名稱。出于性能原因,應該清除緩存,除非更改圖像名。內置的?ImageTagHelper 可以自動更改圖像名稱,?ImageTagHelper 可將版本號追加到圖像名稱,因此每當更改圖像時,服務器會自動為圖像生成一個新的唯一的版本。保證客戶端可以獲取到當前圖像。
大多數內置的標簽助手均指向現有的 HTML 元素,并為元素提供服務端屬性。例如,Views/Account 文件夾中許多使用的<input>元素包含 asp-for 屬性,它將指定的模型屬性的名稱提取到呈現的 HTML 中。asp-for 屬性有2 LabelTagHelper 中的 For 屬性提供。
*管理標簽助手范圍
?標簽助手范圍由 @addTagHelper, @removeTagHelper 和 “!” 為推出字符串的組合控制。
@addTagHelper 使標簽助手可用。默認?_ViewImports.cshtml 文件:
@using MVCTest
@using MVCTest.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper "MVCTest.TagHelpers.EmailTagHelper,MVCTest"
上面的代碼使用通配符語法(“ * ”)來指定程序集中的所有標簽助手將可用于Views目錄或子目錄中的每個視圖文件。@addTagHelper 之后的第一個參數指定要裝載的標簽助手,第二個參數 “Microsoft.AspNetCore.Mvc.TagHelpers” 指定包含標簽助手的程序集。?Microsoft.AspNetCore.Mvc.TagHelpers 是內置的 ASP.NET Core 標簽助手的程序集。
如果你的項目包含具有默認命名空間(AuthoringTagHelpers.TagHelpers.EmailTagHelper)的?EmailTagHelper,則可以提供標簽助手的完全限定名(FQN):
@using MVCTest
@using MVCTest.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper “AuthoringTagHelpers.TagHelpers.EmailTagHelper,AuthoringTagHelpers”
?要想使用 FQN 向視圖添加標簽助手,請先添加 FQN?(AuthoringTagHelpers.TagHelpers.EmailTagHelper),然后再添加程序集名稱(AuthoringTagHelpers)。大多數開發人員喜歡使用 “*” 通配符語法。通配符語法允許在 FQN 中插入通配符 “*” 作為后綴。例如:
@addTagHelper “AuthoringTagHelpers.TagHelpers.E *,AuthoringTagHelpers”
@addTagHelper “AuthoringTagHelpers.TagHelpers.Email *,AuthoringTagHelpers”
如果希望選擇啟用將標簽助手僅顯示給那些視圖,則可以再特定視圖中使用?@addTagHelper 指令。
* @removeTagHelper 刪除標簽助手
@removeTagHelper 具有與 @addTagHelper 相同的兩個參數,它會刪除之前添加的標簽助手。例如,應用于特定視圖的?@removeTagHelper 從視圖中刪除指定的標簽助手。在Views/Floder/_ViewImports.cshtml 文件中使用??@removeTagHelper 從Floder 的所有視圖中刪除指定的標簽助手。
*使用 _ViewImports.cshtml? 文件控制標簽助手范圍
你可以將?ViewImports.cshtml? 添加到任何視圖文件夾,并且駛入引擎將來自?ViewImports.cshtml? 文件的指令添加到 Views/ViewImports.cshtml 文件包含的指令中。如果為 Home 視圖添加一個空的?ViewImports.cshtml? 文件,則不會有任何改變,因為?ViewImports.cshtml? 文件是疊加的。任何添加到?Views/Home/ViewImports.cshtml 文件的 @addTagHelper 指令都會使用這些標簽助手僅顯示在Home 文件夾中。
*選擇退出個別元素
你可以使用標簽助手退出符(“ ! ”)在元素級別停用標簽助手。例如,使用標簽助手退出符在<span>中禁用郵件驗證:
<!span asp-validation-for="Email" class="text-danger"><!span>
必須將標簽助手退出符應用于開始和結束標記。添加標簽助手退出符后,元素和標簽助手屬性不再以特殊字體顯示。
2.使用 @tagHelperPrefix 使標簽助手顯示使用
@tagHelperPrefix 指令允許你指定標簽前綴字符串以啟用標簽助手支持,并使標簽助手顯示使用。例如下面代碼,標簽助手前綴設置為 th: ,因此只使用前綴為 th: support Tag Helper (啟用標簽助手的元素特殊字體)的元素。<label>和<input> 元素有標簽助手前綴,并且啟用了標簽助手,而<sapn> 元素不啟用:
<div class="form-group">
<th:label asp-for="Id" class="control-label"></th:label>
<th:input asp-for="Id" class="form-control" />
<span asp-validation-for="Id" class="text-danger"></span>
</div>
適用于 @addTagHelper 的相同層次結構規則也是用于 @tagHelperPrefix。
當在 VS 中創建一個 web 應用時,在 project.json 文件中添加 “Microsoft.AspNetCore.Razor.Tool”,這就是添加 Tag Helper 工具的包。
在 VS 編輯器中一輸入 <l ,智能感知就會顯示匹配的元素。智能感知語句允許用 Tab 鍵來輸入所選值的語句。
你可以在屬性值里面(雙引號里)輸入VS的CompleteWord快捷鍵(默認是Ctrl+空格),現在在C#中,就像一個C#類。智能感知顯示頁面模型的所有方法和屬性,也可以幫助選擇CSS類。
3.標簽助手 Tag Helpers 和 HTML Helpers 比較
?標簽助手是附加到 Razor 視圖中的 HTML 元素,而 HTML 助手則是在 Razor 視圖中穿插的 HTML 的方法調用。下面的 Razor 標記會創建一個帶 CSS 類 “caption” 的HTML標簽:
@Html.Label("FirstName", "First Name:", new {@class="caption"})
@符號告訴Razor這是代碼的開始。接下來的兩個參數(“FirstName” 和 “First Name:”)是字符串,因此IntelliSence 不能幫助。最后一個參數?new {@class="caption"} 是用于表示屬性的匿名對象。因為 class 是C#中的關鍵字,所以使用@符號強制C#將@class=解釋為符號。
使用LabelTagHelper,相同的標記可以寫為:
<label asp-for="FirstName" class="caption"></label>
使用LabelTagHelper,只要在 VS 中輸入 <l ,智能感知就會顯示匹配的元素。
下面代碼是 VS2015 中 ASP.NET 4.5.x MVC 模板生成的? Razor? 視圖表單部分:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>修改資料</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.Account)
<div class="form-group">
@Html.LabelFor(model => model.Id, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10" style="padding-top:7px">
@Html.DisplayFor(model => model.Id, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Account, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10" style="padding-top:7px">
@Html.DisplayFor(model => model.Account, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="保存" class="btn btn-default" />
</div>
</div>
</div>
}
下面是 ASP.NET Core MVC 模板的標簽助手表單部分代碼:
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Id" class="control-label"></label>
<input asp-for="Id" class="form-control" />
<span asp-validation-for="Id" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Name" class="control-label"></label>
<input asp-for="Name" class="form-control" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</form>
</div>
4.標簽助手和 WEB 服務器控件比較
Web 服務器控件在頁面上聲明和調用。標簽助手不擁有與其關聯的元素,它們只是簡單地參與元素和內容的呈現。
Web 服務器控件有一個不同的生命周期,使其開發和調試變得困難。
Web 服務器控件允許通過使用客戶機空間向客戶端文檔對象模型(DOM)添加功能。標簽助手沒有DOM。
Web 服務器控件包括自動瀏覽器檢測,標簽助手不能識別瀏覽器。
多個標簽助手可以對同一元素執行操作,但通常無法編寫?Web 服務器控件。
標簽助手可以修改其范圍限定的HTML元素的標記和內容,但不直接修改頁面上的任何其他內容。
Web 服務器控件使用類型轉換器將字符串轉為對象,有了標簽助手,可以在C#中工作,不需要做類型轉換。
Web 服務器控件使用 System.ComponentModel 來實現組件和控件的運行時和設計時行為。System.ComponentModel 包括用于實現屬性和類轉換器,綁定到數據源和許可組件的基類和接口。與標簽助手相比,通常派生自 TagHelper,TagHelper基類僅公開 Process? 和 ProcessAsync 兩個方法。
5.自定義標簽助手
?1.編寫一個?email 標簽助手
標簽助手是任何實現ITagHelper 接口的類。然而,編寫一個標簽助手時,通常是從?TagHelper 類開始,這樣可以訪問?Process 方法。
首先創建一個?TagHelpers 文件夾,添加一個?EmailTagHelper 類:
public class EmailTagHelper:TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "a"; //用于將 <email> 替換為 <a>
}
}
注意:
* 標簽助手使用以目標元素名作為根類名(出去類名中的TagHelper部分)的命名約定,EmailTagHelper最終對應的標簽是 email?
*?EmailTagHelper 類需派生自?TagHelper,重寫?Process 方法
*?Process 或?ProcessAsync 的上下文參數包含了與當前 HTML 標簽執行的相關信息,輸出參數包含了用來生成HTML標簽和內容的源代碼的靜態HTML元素呈現。
類名后綴不是必須為TagHelper,但是建議加上。
下面在項目中使用 email 標簽助手。在?_ViewImports.cshtml ,使用?addTagHelper 添加??EmailTagHelper類:
@using MVCTest
@using MVCTest.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper "MVCTest.TagHelpers.EmailTagHelper,MVCTest"
@addTagHelper 之后的第一個字符串指明要加載的標簽助手,第二個字符串指明此標簽助手所在的程序集,在 Views/Home/Contact.cshtml 文件中加入標簽:
@{
ViewData["Title"] = "Contact";
}
<h2>@ViewData["Title"]</h2>
<h3>@ViewData["Message"]</h3>
<address>
One Microsoft Way<br />
Redmond, WA 98052-6399<br />
<abbr title="Phone">P:</abbr>
425.555.0100
</address>
<address>
<strong>Support:</strong> <email>Support</email><br />
<strong>Marketing:</strong> <email>Marketing</email>
</address>
運行程序并使用瀏覽器查看HTML代碼,可以看到 email 標簽都被替換成鏈接標簽。但是沒有一個 href 屬性。
2.完善 email 標簽助手
更新EmailTagHelper類:
public class EmailTagHelper:TagHelper
{
private const string EmailDomain = "contoso.com";
public string MailTo { get; set; } //增加 nail-to 屬性,如 <email mail-to="..." />
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "a"; //用于將 <email> 替換為 <a>
var address = MailTo + "@" + EmailDomain;
output.Attributes.SetAttribute("href","mailto:"+address);
output.Content.SetContent(address); //設置標簽助手的內容
}
}
更新Views/Home/Contact.cshtml? ,加上 mail-to 屬性:
@{
ViewData["Title"] = "Contact";
}
<h2>@ViewData["Title"]</h2>
<h3>@ViewData["Message"]</h3>
<address>
One Microsoft Way<br />
Redmond, WA 98052-6399<br />
<abbr title="Phone">P:</abbr>
425.555.0100
</address>
<address>
<strong>Support:</strong> <email mail-to="Support">Support</email><br />
<strong>Marketing:</strong> <email mail-to="Marketing">Marketing</email>
</address>
以 Pascal? 形式命名標簽助手的類名及屬性名會被翻譯成它們的小寫 kebab 形式。因此使用 MailTo 屬性,與使用 <eamil mail-to="value" />。
3.異步標簽助手
更新EmailTagHelper:
public class EmailTagHelper:TagHelper
{
private const string EmailDomain = "contoso.com";
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "a"; //用于將 <email> 替換為 <a>
var content = await output.GetChildContentAsync();
var target = content.GetContent() + "@" + EmailDomain;
output.Attributes.SetAttribute("href", "mailto:" + target);
output.Content.SetContent(target);
}
}
Views/Home/Contact.cshtml :
@{
ViewData["Title"] = "Contact";
}
<h2>@ViewData["Title"]</h2>
<h3>@ViewData["Message"]</h3>
<address>
One Microsoft Way<br />
Redmond, WA 98052-6399<br />
<abbr title="Phone">P:</abbr>
425.555.0100
</address>
<address>
<strong>Support:</strong> <email>Support</email><br />
<strong>Marketing:</strong> <email>Marketing</email>
</address>
原文鏈接:https://www.cnblogs.com/afei-24/p/11253946.html
相關推薦
- 2022-06-22 android實現注冊登錄程序_Android
- 2023-10-17 uniapp通過功能性編碼跳轉到原生的app頁面
- 2022-06-14 Golang監聽日志文件并發送到kafka中_Golang
- 2023-03-28 Python利用flask操作Redis的方法詳解_python
- 2024-03-02 Quasar框架使用環境變量聲明接口地址,無需手動判斷
- 2023-07-26 node基于express+mongodb項目的整體結構搭建和邏輯抽離
- 2022-12-03 詳解QML?調用?C++?中的內容_C 語言
- 2023-02-02 Nginx顯示500錯誤的原因以及解決方法_nginx
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支