Dela via


Partiella vyer i ASP.NET Core

Av Steve Smith, Maher JENDOUBI, Rick Anderson och Scott Sauber

En partiell vy är en Razor markeringsfil (.cshtml) utan ett @page direktiv som återger HTML-utdata i en annan markeringsfils renderade utdata.

Termen partiell vy används när du utvecklar antingen en MVC-app, där markeringsfiler kallas vyer eller en Razor Pages-app, där markeringsfiler kallas sidor. Det här avsnittet refererar allmänt till MVC-vyer och Razor sidor som markeringsfiler.

Visa eller ladda ned exempelkod (hur du laddar ned)

När du ska använda partiella vyer

Partiella vyer är ett effektivt sätt att:

  • Dela upp stora markeringsfiler i mindre komponenter.

    I en stor, komplex markeringsfil som består av flera logiska delar finns det en fördel med att arbeta med varje del isolerad i en partiell vy. Koden i markeringsfilen är hanterbar eftersom markering endast innehåller den övergripande sidstrukturen och referenser till partiella vyer.

  • Minska dupliceringen av vanligt märkningsinnehåll över markupfiler.

    När samma markeringselement används i markeringsfiler, eliminerar en partiell vy duplicering av markeringsinnehåll genom att använda en enda partiell vyfil. När markeringen ändras i den partiella vyn uppdateras de renderade utdata från de markeringsfiler som använder den partiella vyn.

Partiella vyer ska inte användas för att underhålla vanliga layoutelement. Vanliga layoutelement bör anges i _Layout.cshtml-filer .

Använd inte en partiell vy där komplex renderingslogik eller kodkörning krävs för att återge markering. Använd en vykomponent i stället för en partiell vy.

Deklarera partiella vyer

En partiell vy är en .cshtml markeringsfil utan ett @page direktiv som underhålls i mappen Views (MVC) eller Pages (Razor Pages).

I ASP.NET Core MVC kan en kontrollants ViewResult returnera antingen en vy eller en partiell vy. I Razor Sidor kan en PageModel returnera en partiell vy som representeras som ett PartialViewResult objekt. Referens till och återgivning av partiella vyer beskrivs i avsnittet Referera till en partiell vy .

Till skillnad från MVC-vy eller sidåtergivning körs inte en partiell vy _ViewStart.cshtml. Mer information om _ViewStart.cshtmlfinns i Layout i ASP.NET Core.

Filnamn för partiell vy börjar ofta med ett understreck (_). Den här namngivningskonventionen krävs inte, men den hjälper till att visuellt skilja partiella vyer från vyer och sidor.

En partiell vy är en .cshtml markeringsfil som underhålls i mappen Vyer .

En kontrollernas ViewResult kan returnera antingen en vy eller en partiell vy. Referens till och återgivning av partiella vyer beskrivs i avsnittet Referera till en partiell vy .

Till skillnad från MVC-visningsrendering körs inte _ViewStart.cshtml i en partiell vy. Mer information om _ViewStart.cshtmlfinns i Layout i ASP.NET Core.

Filnamn för partiell vy börjar ofta med ett understreck (_). Den här namngivningskonventionen är inte obligatorisk, men den hjälper till att visuellt skilja delvisa vyer från fullständiga vyer.

Referera till en partiell vy

Använd en partiell vy i en Razor sidmodell

I ASP.NET Core 2.0 eller 2.1 återger följande hanteringsmetod _AuthorPartialRP.cshtml partiell vy till svaret:

public IActionResult OnGetPartial() =>
    new PartialViewResult
    {
        ViewName = "_AuthorPartialRP",
        ViewData = ViewData,
    };

I ASP.NET Core 2.2 eller senare kan en hanteringsmetod anropa Partial metoden för att skapa ett PartialViewResult objekt:

public IActionResult OnGetPartial() =>
    Partial("_AuthorPartialRP");

Använda en partiell vy i en markeringsfil

I en markeringsfil finns det flera sätt att referera till en partiell vy. Vi rekommenderar att appar använder någon av följande asynkrona återgivningsmetoder:

I en markeringsfil finns det två sätt att referera till en partiell vy:

Vi rekommenderar att appar använder den asynkrona HTML-hjälpen.

Assistent för partiella taggar

Den partiella tag-hjälpen kräver ASP.NET Core 2.1 eller senare.

Den partiella tag-hjälpen återger innehåll asynkront och använder en HTML-liknande syntax:

<partial name="_PartialName" />

När ett filnamnstillägg finns refererar Tag Helper till en partiell vy som måste finnas i samma mapp som markeringsfilen som anropar den partiella vyn:

<partial name="_PartialName.cshtml" />

Följande exempel hänvisar till en partiell vy från applikationens rotmapp. Sökvägar som börjar med ett tilde-snedstreck (~/) eller ett snedstreck (/) refererar till approten:

Razor sidor

<partial name="~/Pages/Folder/_PartialName.cshtml" />
<partial name="/Pages/Folder/_PartialName.cshtml" />

MVC

<partial name="~/Views/Folder/_PartialName.cshtml" />
<partial name="/Views/Folder/_PartialName.cshtml" />

Följande exempel refererar till en partiell vy med en relativ sökväg:

<partial name="../Account/_PartialName.cshtml" />

Mer information finns i Partiell tag-hjälp i ASP.NET Core.

Asynkron HTML-hjälp

När du använder en HTML-hjälp är det bästa sättet att använda PartialAsync. PartialAsync returnerar en IHtmlContent datatyp omsluten i en Task<TResult>. Metoden refereras till genom att prefixa det väntande anropet med ett @ tecken:

@await Html.PartialAsync("_PartialName")

När filtillägget finns refererar HTML-hjälpen till en partiell vy som måste finnas i samma mapp som markeringsfilen som anropar den partiella vyn:

@await Html.PartialAsync("_PartialName.cshtml")

Följande exempel hänvisar till en partiell vy från applikationens rotmapp. Sökvägar som börjar med ett tilde-snedstreck (~/) eller ett snedstreck (/) refererar till approten:

Razor sidor

@await Html.PartialAsync("~/Pages/Folder/_PartialName.cshtml")
@await Html.PartialAsync("/Pages/Folder/_PartialName.cshtml")

MVC

@await Html.PartialAsync("~/Views/Folder/_PartialName.cshtml")
@await Html.PartialAsync("/Views/Folder/_PartialName.cshtml")

Följande exempel refererar till en partiell vy med en relativ sökväg:

@await Html.PartialAsync("../Account/_LoginPartial.cshtml")

Du kan också återge en partiell vy med RenderPartialAsync. Den här metoden returnerar inte en IHtmlContent. Den strömmar de renderade utdata direkt till svaret. Eftersom metoden inte returnerar något resultat måste den anropas i ett Razor kodblock:

@{
    await Html.RenderPartialAsync("_AuthorPartial");
}

Eftersom RenderPartialAsync strömmar renderat innehåll ger det bättre prestanda i vissa scenarier. I prestandakritiska situationer jämför du sidan med båda metoderna och använder den metod som genererar ett snabbare svar.

Synkron HTML-hjälp

Partial och RenderPartial är synkrona motsvarigheter till PartialAsync respektive RenderPartialAsync. Synkrona motsvarigheter rekommenderas inte eftersom det finns scenarier där de kan fastna i ett dödläge. Synkrona metoder är avsedda för borttagning i en framtida version.

Important

Om du behöver köra kod använder du en vykomponent i stället för en partiell vy.

Anropa Partial eller RenderPartial resulterar i en Visual Studio-analysvarning. Förekomsten av Partial ger till exempel följande varningsmeddelande:

Användning av IHtmlHelper.Partial kan leda till programlåsningar. Överväg att använda <partiell> Tag Helper eller IHtmlHelper.PartialAsync.

Ersätt anrop till @Html.Partial med @await Html.PartialAsync eller partiell tag-hjälpare. Mer information om migrering av partiell tagghjälp finns i Migrera från en HTML-hjälp.

Upptäckt av partiell vy

När en partiell vy refereras efter namn utan filnamnstillägg genomsöks följande platser i angiven ordning:

Razor sidor

  1. Kör för närvarande sidans mapp
  2. Katalogdiagram ovanför sidans mapp
  3. /Shared
  4. /Pages/Shared
  5. /Views/Shared

MVC

  1. /Areas/<Area-Name>/Views/<Controller-Name>
  2. /Areas/<Area-Name>/Views/Shared
  3. /Views/Shared
  4. /Pages/Shared
  1. /Areas/<Area-Name>/Views/<Controller-Name>
  2. /Areas/<Area-Name>/Views/Shared
  3. /Views/Shared

Följande konventioner gäller för identifiering av partiell vy:

  • Olika partiella vyer med samma filnamn tillåts när de partiella vyerna finns i olika mappar.
  • När du refererar till en partiell vy efter namn utan filnamnstillägg och den partiella vyn finns i både anroparens mapp och mappen Delad , ger den partiella vyn i anroparens mapp den partiella vyn. Om den partiella vyn inte finns i anroparens mapp tillhandahålls den partiella vyn från den delade mappen. Partiella vyer i den delade mappen kallas delade partiella vyer eller partiella standardvyer.
  • Partiella vyer kan kedjas och en partiell vy kan anropa en annan partiell vy så länge de inte bildar en cirkulär referens. Relativa sökvägar är alltid relativa till den aktuella filen, inte till rotkatalogen eller föräldrakatalogen.

Note

En Razorsection definierad i en partiell vy är osynlig för överordnade markeringsfiler. section är bara synlig för den partiella vy där den definieras.

Få åtkomst till data från partiella vyer

När en partiell vy instansieras får den en kopia av den överordnade ViewData ordlistan. Uppdateringar som görs av data i den partiella vyn sparas inte i den överordnade vyn. ViewData ändringar i en partiell vy går förlorade när den partiella vyn returneras.

I följande exempel visas hur du skickar en instans av ViewDataDictionary till en partiell vy:

@await Html.PartialAsync("_PartialName", customViewData)

Du kan överföra en modell till en delvy. Modellen kan vara ett anpassat objekt. Du kan skicka en modell med PartialAsync (renderar ett innehållsblock till anroparen) eller RenderPartialAsync (strömmar innehållet till utdata):

@await Html.PartialAsync("_PartialName", model)

Razor sidor

Följande markering i exempelappen kommer från sidan Pages/ArticlesRP/ReadRP.cshtml . Sidan innehåller två delvisa vyer. Den andra partiella vyn skickas i en modell och ViewData till den partiella vyn. Konstruktorns ViewDataDictionary överlagring används för att skicka en ny ViewData ordlista samtidigt som den befintliga ViewData ordlistan behålls.

@model ReadRPModel

<h2>@Model.Article.Title</h2>
@* Pass the author's name to Pages\Shared\_AuthorPartialRP.cshtml *@
@await Html.PartialAsync("../Shared/_AuthorPartialRP", Model.Article.AuthorName)
@Model.Article.PublicationDate

@* Loop over the Sections and pass in a section and additional ViewData to 
   the strongly typed Pages\ArticlesRP\_ArticleSectionRP.cshtml partial view. *@
@{
    var index = 0;

    foreach (var section in Model.Article.Sections)
    {
        await Html.PartialAsync("_ArticleSectionRP", 
                                section,
                                new ViewDataDictionary(ViewData)
                                {
                                    { "index", index }
                                });

        index++;
    }
}

Pages/Shared/_AuthorPartialRP.cshtml är den första partiella vyn som refereras av ReadRP.cshtml markeringsfilen:

@model string
<div>
    <h3>@Model</h3>
    This partial view from /Pages/Shared/_AuthorPartialRP.cshtml.
</div>

Pages/ArticlesRP/_ArticleSectionRP.cshtml är den andra partiella vyn som refereras av markeringsfilen ReadRP.cshtml :

@using PartialViewsSample.ViewModels
@model ArticleSection

<h3>@Model.Title Index: @ViewData["index"]</h3>
<div>
    @Model.Content
</div>

MVC

Följande markering i exempelappen visar Views/Articles/Read.cshtml vyn. Vyn innehåller två partiella vyer. Den andra partiella vyn skickas i en modell och ViewData till den partiella vyn. Konstruktorns ViewDataDictionary överlagring används för att skicka en ny ViewData ordlista samtidigt som den befintliga ViewData ordlistan behålls.

@model PartialViewsSample.ViewModels.Article

<h2>@Model.Title</h2>
@* Pass the author's name to Views\Shared\_AuthorPartial.cshtml *@
@await Html.PartialAsync("_AuthorPartial", Model.AuthorName)
@Model.PublicationDate

@* Loop over the Sections and pass in a section and additional ViewData to 
   the strongly typed Views\Articles\_ArticleSection.cshtml partial view. *@
@{
    var index = 0;

    foreach (var section in Model.Sections)
    {
        @(await Html.PartialAsync("_ArticleSection", 
                                section,
                                new ViewDataDictionary(ViewData)
                                {
                                    { "index", index }
                                }))

        index++;
    }
}

Views/Shared/_AuthorPartial.cshtml är den första partiella vyn som refereras av Read.cshtml markeringsfilen:

@model string
<div>
    <h3>@Model</h3>
    This partial view from /Views/Shared/_AuthorPartial.cshtml.
</div>

Views/Articles/_ArticleSection.cshtml är den andra partiella vyn som refereras av markeringsfilen Read.cshtml :

@using PartialViewsSample.ViewModels
@model ArticleSection

<h3>@Model.Title Index: @ViewData["index"]</h3>
<div>
    @Model.Content
</div>

Vid körning renderas delmängderna i den överordnade markeringsfilens renderade utdata, som i sig återges i den delade _Layout.cshtml. Den första partiella vyn återger artikelförfattarens namn och publiceringsdatum:

Abraham Lincoln

Den här partiella vyn från <filsökvägen> för delad partiell vy. 11/19/1863 12:00:00

Den andra partiella vyn återger artikelns avsnitt:

Avsnitt 1 index: 0

Fyra poäng och sju år sedan...

Avsnitt Två Index: 1

Nu är vi engagerade i ett stort inbördeskrig, testar ...

Index för avsnitt tre: 2

Men sett ur ett större perspektiv kan vi inte ägna ...

Ytterligare resurser