ASP.NET Core'da kısmi görünümler

Steve Smith, Maher JENDOUBI, Rick Anderson ve Scott Sauber

Kısmi görünüm, başka bir Razor işaretleme dosyasının işlenmiş çıktısı içinde HTML çıkışını işleyen bir yönergesi olmayan bir @page işaretleme dosyasıdır (.cshtml).

Kısmi görünüm terimi, işaretleme dosyalarının görünüm olarak adlandırıldığı bir MVC uygulaması veya işaretleme dosyalarının sayfa olarak adlandırıldığı Sayfalar Razor uygulaması geliştirirken kullanılır. Bu konu genellikle MVC görünümlerini ve Razor Sayfalar sayfalarını işaretleme dosyaları olarak ifade eder.

Örnek kodu görüntüleme veya indirme (indirme)

Kısmi görünümler ne zaman kullanılır?

Kısmi görünümler şunlar için etkili bir yoldur:

  • Büyük işaretleme dosyalarını daha küçük bileşenlere ayırın.

    Birkaç mantıksal parçadan oluşan büyük, karmaşık bir işaretleme dosyasında, kısmi görünümde yalıtılmış her parçayla çalışmanın bir avantajı vardır. İşaretlemeyi yalnızca genel sayfa yapısını içerdiğinden ve kısmi görünümlere başvurular içerdiğinden, işaretleme dosyasındaki kod yönetilebilir.

  • İşaretleme dosyaları arasında ortak işaretleme içeriğinin çoğaltılmışlığını azaltın.

    İşaretleme dosyalarında aynı işaretleme öğeleri kullanıldığında, kısmi görünüm, işaretleme içeriğinin tek bir kısmi görünüm dosyasına çoğaltılma işlemini kaldırır. Kısmi görünümde işaretleme değiştirildiğinde, kısmi görünümü kullanan işaretleme dosyalarının işlenmiş çıkışını güncelleştirir.

Ortak düzen öğelerini korumak için kısmi görünümler kullanılmamalıdır. Ortak düzen öğeleri _Layout.cshtml dosyalarında belirtilmelidir.

İşaretlemeyi işlemek için karmaşık işleme mantığının veya kod yürütmenin gerekli olduğu kısmi bir görünüm kullanmayın. Kısmi görünüm yerine görünüm bileşeni kullanın.

Kısmi görünümleri bildirme

Kısmi görünüm, Views klasöründe (MVC) veya Pages klasöründe (RazorPages) korunan bir yönergesi olmayan bir @page işaretleme dosyasıdır.cshtml.

ASP.NET Core MVC'de denetleyicinin ViewResult görünümü veya kısmi görünümü döndürebilme özelliği vardır. Sayfalar'da Razor , nesne PageModel olarak temsil edilen kısmi bir PartialViewResult görünüm döndürebilir. Kısmi görünümlere başvurma ve görüntüleme, Kısmi görünüme başvurma bölümünde açıklanmıştır.

MVC görünümünden veya sayfa işlemeden farklı olarak kısmi görünüm çalışmaz _ViewStart.cshtml. hakkında _ViewStart.cshtmldaha fazla bilgi için bkz . ASP.NET Core'da düzen.

Kısmi görünüm dosyası adları genellikle bir alt çizgiyle (_ ) başlar. Bu adlandırma kuralı gerekli değildir, ancak görünümlerden ve sayfalardan kısmi görünümleri görsel olarak ayırt etmeye yardımcı olur.

Kısmi görünüm, Görünümler klasöründe tutulan bir .cshtml işaretleme dosyasıdır.

Denetleyicinin ViewResult görünümü veya kısmi görünümü döndürebilme özelliği vardır. Kısmi görünümlere başvurma ve görüntüleme, Kısmi görünüme başvurma bölümünde açıklanmıştır.

MVC görünümü işlemeden farklı olarak, kısmi görünüm çalışmaz _ViewStart.cshtml. hakkında _ViewStart.cshtmldaha fazla bilgi için bkz . ASP.NET Core'da düzen.

Kısmi görünüm dosyası adları genellikle bir alt çizgiyle (_ ) başlar. Bu adlandırma kuralı gerekli değildir, ancak kısmi görünümleri görünümlerden görsel olarak ayırt etmeye yardımcı olur.

Kısmi görünüme başvurma

Sayfalar PageModel'de Razor kısmi görünüm kullanma

ASP.NET Core 2.0 veya 2.1'de, aşağıdaki işleyici yöntemi yanıta _AuthorPartialRP.cshtml kısmi görünümünü işler:

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

ASP.NET Core 2.2 veya sonraki sürümlerinde işleyici yöntemi alternatif olarak nesnesini oluşturmak PartialViewResult için yöntemini çağırabilirPartial:

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

biçimlendirme dosyasında kısmi görünüm kullanma

Bir işaretleme dosyası içinde, kısmi görünüme başvurmanın çeşitli yolları vardır. Uygulamaların aşağıdaki zaman uyumsuz işleme yaklaşımlarından birini kullanmasını öneririz:

Bir işaretleme dosyası içinde kısmi görünüme başvurmanın iki yolu vardır:

Uygulamaların Zaman Uyumsuz HTML Yardımcısı'nı kullanmasını öneririz.

Kısmi Etiket Yardımcısı

Kısmi Etiket Yardımcısı için ASP.NET Core 2.1 veya üzeri gerekir.

Kısmi Etiket Yardımcısı içeriği zaman uyumsuz olarak işler ve HTML benzeri bir söz dizimi kullanır:

<partial name="_PartialName" />

Bir dosya uzantısı mevcut olduğunda Etiket Yardımcısı, kısmi görünümü çağıran işaretleme dosyasıyla aynı klasörde olması gereken kısmi bir görünüme başvurur:

<partial name="_PartialName.cshtml" />

Aşağıdaki örnek, uygulama kökünden kısmi bir görünüme başvurur. Tilde-slash () veya eğik çizgi (~//) ile başlayan yollar uygulama köküne başvurur:

Razor Sayfaları

<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" />

Aşağıdaki örnek, göreli yolu olan kısmi bir görünüme başvurur:

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

Daha fazla bilgi için bkz . ASP.NET Core'da Kısmi Etiket Yardımcısı.

Zaman Uyumsuz HTML Yardımcısı

HTML Yardımcısı kullanırken en iyi yöntem kullanmaktır PartialAsync. PartialAsync içinde sarmalanmış bir IHtmlContentTask<TResult>tür döndürür. Yöntemine, beklenen çağrıya bir @ karakter eklenerek başvurulur:

@await Html.PartialAsync("_PartialName")

Dosya uzantısı mevcut olduğunda, HTML Yardımcısı kısmi görünümü çağıran işaretleme dosyasıyla aynı klasörde olması gereken kısmi bir görünüme başvurur:

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

Aşağıdaki örnek, uygulama kökünden kısmi bir görünüme başvurur. Tilde-slash () veya eğik çizgi (~//) ile başlayan yollar uygulama köküne başvurur:

Razor Sayfaları

@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")

Aşağıdaki örnek, göreli yolu olan kısmi bir görünüme başvurur:

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

Alternatif olarak, ile RenderPartialAsynckısmi bir görünüm işleyebilirsiniz. Bu yöntem bir IHtmlContentdöndürmez. İşlenen çıkışı doğrudan yanıta akışla aktarır. yöntemi bir sonuç döndürmediğinden, bir Razor kod bloğu içinde çağrılmalıdır:

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

RenderPartialAsync Akışlar içerik işlendiği için bazı senaryolarda daha iyi performans sağlar. Performans açısından kritik durumlarda, her iki yaklaşımı da kullanarak sayfayı kıyaslayın ve daha hızlı yanıt oluşturan yaklaşımı kullanın.

Zaman Uyumlu HTML Yardımcısı

Partialve RenderPartial sırasıyla ve RenderPartialAsyncdeğerlerinin zaman uyumlu eşdeğerleridirPartialAsync. Kilitlenme senaryoları olduğundan zaman uyumlu eşdeğerler önerilmez. Zaman uyumlu yöntemler, gelecek bir sürümde kaldırılmasını hedeflemektedir.

Önemli

Kod yürütmeniz gerekiyorsa, kısmi görünüm yerine bir görünüm bileşeni kullanın.

Çağırma Partial veya RenderPartial Visual Studio çözümleyicisi uyarısıyla sonuçlandırma. Örneğin, varlığı Partial aşağıdaki uyarı iletisini verir:

IHtmlHelper.Partial kullanımı uygulama kilitlenmelerine neden olabilir. Kısmi> Etiket Yardımcısı veya IHtmlHelper.PartialAsync kullanmayı <göz önünde bulundurun.

veya @Html.Partial Kısmi Etiket Yardımcısı ile @await Html.PartialAsync çağrılarını değiştirin. Kısmi Etiket Yardımcısı geçişi hakkında daha fazla bilgi için bkz . HTML Yardımcısı'ndan geçiş.

Kısmi görünüm bulma

Dosya uzantısı olmayan ada göre kısmi bir görünüme başvurulduğunda, aşağıdaki konumlar belirtilen sırada aranılır:

Razor Sayfaları

  1. Şu anda sayfanın klasörü yürütülüyor
  2. Sayfanın klasörünün üzerindeki dizin grafiği
  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

Kısmi görünüm bulma için aşağıdaki kurallar geçerlidir:

  • Kısmi görünümler farklı klasörlerde olduğunda, aynı dosya adına sahip farklı kısmi görünümlere izin verilir.
  • Dosya uzantısı olmadan ada göre kısmi görünüme başvururken ve kısmi görünüm hem çağıranın klasöründe hem de Paylaşılan klasöründe mevcut olduğunda, çağıranın klasöründeki kısmi görünüm kısmi görünümü sağlar. Arayanın klasöründe kısmi görünüm yoksa, kısmi görünüm Paylaşılan klasöründen sağlanır. Paylaşılan klasöründeki kısmi görünümler, paylaşılan kısmi görünümler veya varsayılan kısmi görünümler olarak adlandırılır.
  • Kısmi görünümler zincirlenebilir; çağrılar tarafından döngüsel başvuru oluşturulmamışsa kısmi görünüm başka bir kısmi görünümü çağırabilir. Göreli yollar, dosyanın köküne veya üst öğesine değil, her zaman geçerli dosyaya göredir.

Dekont

Razorsection Kısmi görünümde tanımlanan bir öğe, üst işaretleme dosyaları için görünmez. section yalnızca içinde tanımlandığı kısmi görünümde görünür.

Kısmi görünümlerden verilere erişme

Kısmi görünüm örneği görüntülendiğinde, üst ViewData öğe sözlüğün bir kopyasını alır. Kısmi görünümdeki verilere yapılan Güncelleştirmeler üst görünümde kalıcı olmaz. ViewData kısmi görünüm döndürdüğünde kısmi görünümdeki değişiklikler kaybolur.

Aşağıdaki örnek, örneğinin kısmi bir ViewDataDictionary görünüme nasıl geçir yapılacağını gösterir:

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

Modeli kısmi görünüme geçirebilirsiniz. Model özel bir nesne olabilir. Bir modeli ile PartialAsync geçirebilirsiniz (arayana bir içerik bloğu oluşturur) veya RenderPartialAsync (içeriği çıkışa akışla aktarır):

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

Razor Sayfaları

Örnek uygulamada aşağıdaki işaretleme sayfadandır Pages/ArticlesRP/ReadRP.cshtml . Sayfa iki kısmi görünüm içeriyor. İkinci kısmi görünüm bir modelde ve ViewData kısmi görünüme geçer. ViewDataDictionary Oluşturucu aşırı yüklemesi, mevcut ViewData sözlüğü korurken yeni ViewData bir sözlük geçirmek için kullanılır.

@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 , işaretleme dosyası tarafından başvuruda bulunılan ReadRP.cshtml ilk kısmi görünümdür:

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

Pages/ArticlesRP/_ArticleSectionRP.cshtml , işaretleme dosyası tarafından başvuruda bulunılan ReadRP.cshtml ikinci kısmi görünümdür:

@using PartialViewsSample.ViewModels
@model ArticleSection

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

MVC

Örnek uygulamadaki aşağıdaki işaretleme görünümü gösterir Views/Articles/Read.cshtml . Görünüm iki kısmi görünüm içerir. İkinci kısmi görünüm bir modelde ve ViewData kısmi görünüme geçer. ViewDataDictionary Oluşturucu aşırı yüklemesi, mevcut ViewData sözlüğü korurken yeni ViewData bir sözlük geçirmek için kullanılır.

@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 , işaretleme dosyası tarafından başvuruda bulunılan Read.cshtml ilk kısmi görünümdür:

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

Views/Articles/_ArticleSection.cshtml , işaretleme dosyası tarafından başvuruda bulunılan Read.cshtml ikinci kısmi görünümdür:

@using PartialViewsSample.ViewModels
@model ArticleSection

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

Çalışma zamanında kısmi değerler, paylaşılan _Layout.cshtmliçinde işlenen üst işaretleme dosyasının işlenmiş çıkışına işlenir. İlk kısmi görünüm makale yazarının adını ve yayın tarihini işler:

Abraham Lincoln

Paylaşılan kısmi görünüm dosya yolundan <>bu kısmi görünüm. 19.11.1863 12:00:00

İkinci kısmi görünüm makalenin bölümlerini işler:

Bölüm Bir Dizin: 0

Dört puan ve yedi yıl önce ...

Bölüm İki Dizin: 1

Şimdi büyük bir iç savaş yapıyoruz, test ...

Bölüm Üç Dizin: 2

Ancak, daha büyük bir anlamda, ...

Ek kaynaklar