ASP.NET Core 的部分標記協助程式

作者:Scott Addie

如需標籤協助程式的概觀,請參閱 ASP.NET Core 中的標籤協助程式

檢視或下載範例程式碼 \(英文\) (如何下載)

概觀

部分標記協助程式用於在 Razor 頁面和 MVC 應用程式中呈現部分檢視。 請考慮它:

  • 需要 ASP.NET Core 2.1 或更新版本。
  • HTML 協助程式語法的替代方法。
  • 以非同步方式呈現部分檢視。

呈現部分檢視的 HTML 協助程式選項包括:

這整份文件的範例皆使用 Product 模型:

namespace TagHelpersBuiltIn.Models
{
    public class Product
    {
        public int Number { get; set; }

        public string Name { get; set; }

        public string Description { get; set; }
    }
}

部分標記協助程式屬性的清查如下。

NAME

name 屬性 (Attribute) 是必要項。 它會指出要呈現之部分檢視的名稱或路徑。 當提供部分檢視名稱時,就會起始檢視探索程序。 提供明確的路徑時,則會略過該程序。 如需了解所有可接受的 name 值,請參閱部分檢視探索

下列標記會使用明確的路徑,指出將從 Shared 資料夾載入 _ProductPartial.cshtml。 使用 for 屬性,模型就會傳遞到部分檢視以進行繫結。

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

for 屬性會針對目前的模型指派一個要評估的 ModelExpressionModelExpression 可推斷 @Model. 語法。 例如,可以使用 for="Product",而不是 for="@Model.Product"。 使用 @ 符號來定義內嵌運算式會覆寫這個預設的推斷行為。

下列標記會載入 _ProductPartial.cshtml

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

部分檢視會繫結至相關聯的頁面模型 Product 屬性:

using Microsoft.AspNetCore.Mvc.RazorPages;
using TagHelpersBuiltIn.Models;

namespace TagHelpersBuiltIn.Pages
{
    public class ProductModel : PageModel
    {
        public Product Product { get; set; }

        public void OnGet()
        {
            Product = new Product
            {
                Number = 1,
                Name = "Test product",
                Description = "This is a test product"
            };
        }
    }
}

機型

model 屬性指派要傳遞至部分檢視的模型執行個體。 model 屬性不能與 for 屬性一起使用。

在下列標記中,新的 Product 物件將具現化,並傳遞給 model 屬性以進行繫結:

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

view-data

view-data 屬性指派要傳遞至部分檢視的 ViewDataDictionary。 下列標記會讓整個 ViewData 集合可存取部分檢視:

@{
    ViewData["IsNumberReadOnly"] = true;
}

<partial name="_ProductViewDataPartial" for="Product" view-data="ViewData">

在上述程式碼中,IsNumberReadOnly 索引鍵值會設定為 true,並新增至 ViewData 集合。 因此,ViewData["IsNumberReadOnly"] 可以在下列部分檢視內進行存取:

@model TagHelpersBuiltIn.Models.Product

<div class="form-group">
    <label asp-for="Number"></label>
    @if ((bool)ViewData["IsNumberReadOnly"])
    {
        <input asp-for="Number" type="number" class="form-control" readonly />
    }
    else
    {
        <input asp-for="Number" type="number" class="form-control" />
    }
</div>
<div class="form-group">
    <label asp-for="Name"></label>
    <input asp-for="Name" type="text" class="form-control" />
</div>
<div class="form-group">
    <label asp-for="Description"></label>
    <textarea asp-for="Description" rows="4" cols="50" class="form-control"></textarea>
</div>

在此範例中,ViewData["IsNumberReadOnly"] 的值決定 Number 欄位是否會顯示為唯讀。

從 HTML 協助程式移轉

請考慮下列非同步 HTML 協助程式範例。 逐一查看和顯示產品集合。 依據 PartialAsync 方法的第一個參數載入 _ProductPartial.cshtml 部分檢視。 Product 模型的執行個體會傳遞到部分檢視以進行繫結。

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

下列 Partial 標籤協助程式可完成與 PartialAsync HTML 協助程式相同的非同步轉譯行為。 model 屬性會獲指派 Product 模型執行個體,以繫結至部分檢視。

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

其他資源