ASP.NET Core 中的部分标记帮助程序Partial Tag Helper in ASP.NET Core

本文内容

作者:Scott Addie

有关标记帮助程序的概述,请参阅 ASP.NET Core 中的标记帮助程序

查看或下载示例代码如何下载

概述Overview

Partial 标记帮助程序用于在 Razor 页面和 MVC 应用中呈现分部视图请考虑:

  • 需要 ASP.NET Core 2.1 或更高版本。
  • HTML 帮助程序语法的替代方法。
  • 以异步方式呈现分部视图。

用于呈现分部视图的 HTML 帮助程序选项包括:

本文档中的示例均使用产品模型:

  1. namespace TagHelpersBuiltIn.Models
  2. {
  3. public class Product
  4. {
  5. public int Number { get; set; }
  6. public string Name { get; set; }
  7. public string Description { get; set; }
  8. }
  9. }

以下是分部标记帮助程序属性的清单。

namename

需要 name 属性。它指示要呈现的分部视图的名称或路径。提供分部视图名称时,会启动视图发现进程。提供显式路径时,将绕过该进程。有关所有可接受的 name 值,请参阅分部视图发现

以下标记使用显式路径,指示要从共享文件夹加载 _ProductPartial.cshtml。使用 for 属性,将模型传递给分部视图进行绑定。

  1. <partial name="Shared/_ProductPartial.cshtml" for="Product">

forfor

for 属性分配要根据当前模型评估的 ModelExpressionModelExpression 推断 @Model. 语法。例如,可使用 for="Product" 而非 for="@Model.Product"通过使用 @ 符号定义内联表达式来替代此默认推理行为。

以下标记加载 _ProductPartial.cshtml:

  1. <partial name="_ProductPartial" for="Product">

分部视图绑定到关联页模型的 Product 属性:

  1. using Microsoft.AspNetCore.Mvc.RazorPages;
  2. using TagHelpersBuiltIn.Models;
  3. namespace TagHelpersBuiltIn.Pages
  4. {
  5. public class ProductModel : PageModel
  6. {
  7. public Product Product { get; set; }
  8. public void OnGet()
  9. {
  10. Product = new Product
  11. {
  12. Number = 1,
  13. Name = "Test product",
  14. Description = "This is a test product"
  15. };
  16. }
  17. }
  18. }

modelmodel

model 属性分配模型实例,以传递到分部视图。model 属性不能与 for 属性一起使用。

在以下标记中,实例化新的 Product 对象并将其传递给 model 属性进行绑定:

  1. <partial name="_ProductPartial"
  2. model='new Product { Number = 1, Name = "Test product", Description = "This is a test" }'>

view-dataview-data

view-data 属性分配 ViewDataDictionary,以传递到分部视图。以下标记使整个 ViewData 集合可访问分部视图:

  1. @{
  2. ViewData["IsNumberReadOnly"] = true;
  3. }
  4. <partial name="_ProductViewDataPartial" for="Product" view-data="ViewData">

在前面的代码中,IsNumberReadOnly 键值设置为 true 并添加到 ViewData 集合中。因此,在以下分部视图中可访问 ViewData["IsNumberReadOnly"]

  1. @model TagHelpersBuiltIn.Models.Product
  2. <div class="form-group">
  3. <label asp-for="Number"></label>
  4. @if ((bool)ViewData["IsNumberReadOnly"])
  5. {
  6. <input asp-for="Number" type="number" class="form-control" readonly />
  7. }
  8. else
  9. {
  10. <input asp-for="Number" type="number" class="form-control" />
  11. }
  12. </div>
  13. <div class="form-group">
  14. <label asp-for="Name"></label>
  15. <input asp-for="Name" type="text" class="form-control" />
  16. </div>
  17. <div class="form-group">
  18. <label asp-for="Description"></label>
  19. <textarea asp-for="Description" rows="4" cols="50" class="form-control"></textarea>
  20. </div>

在此示例中,ViewData["IsNumberReadOnly"] 的值确定 Number 字段是否显示为只读。

从 HTML 帮助程序迁移Migrate from an HTML Helper

请考虑以下异步 HTML 帮助程序示例。循环访问和显示产品集合。依据 PartialAsync 方法的第一个参数,加载 _ProductPartial.cshtml 分部视图。Product 模型的实例传递给分部视图进行绑定。

  1. @foreach (var product in Model.Products)
  2. {
  3. @await Html.PartialAsync("_ProductPartial", product)
  4. }

以下分部标记帮助程序可实现与 PartialAsync HTML 帮助程序相同的异步呈现行为。model 属性分配有 Product 模型实例以绑定到分部视图。

  1. @foreach (var product in Model.Products)
  2. {
  3. <partial name="_ProductPartial" model="product" />
  4. }

其他资源Additional resources