MVC2'deki Html.Partial (görünüm, model) ve Html.RenderPartial (görünüm, model) arasındaki fark (varsa) nedir?


141

Geri döndüğü tip ve elbette farklı çağırdığınız gerçeği dışında

<% Html.RenderPartial(...); %>
<%= Html.Partial(...) %>  

Eğer farklılarsa, neden diğerinden ziyade birini ararsınız?
Tanımlar:

// Type: System.Web.Mvc.Html.RenderPartialExtensions
// Assembly: System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// Assembly location: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 2\Assemblies\System.Web.Mvc.dll

using System.Web.Mvc;

namespace System.Web.Mvc.Html
{
    public static class RenderPartialExtensions
    {
        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName);
        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, ViewDataDictionary viewData);
        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model);

        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model,
                                     ViewDataDictionary viewData);
    }
}

// Type: System.Web.Mvc.Html.PartialExtensions
// Assembly: System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// Assembly location: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 2\Assemblies\System.Web.Mvc.dll

using System.Web.Mvc;

namespace System.Web.Mvc.Html
{
    public static class PartialExtensions
    {
        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName);

        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName,
                                        ViewDataDictionary viewData);

        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model);

        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model,
                                        ViewDataDictionary viewData);
    }
}

Yanıtlar:


168

Tek fark, yani Partialbir döner MvcHtmlStringve içinde adı olmalıdır <%= %>, buna karşın RenderPartialgeri dönüş voidve görünüme doğrudan vermektedir.

Kaynak koduna bakarsanız, her ikisinin de aynı dahili yöntemi çağırdığını ve bunun için bir StringWriter iletmesini görürsünüz.

PartialOluşturulan HTML'yi sayfaya yazmak yerine görüntülemek, kaydetmek veya değiştirmek istiyorsanız arayın .


Tamam, bu yüzden düşündüğüm gibi :) yok, sanırım onları sorunsuz bir şekilde kullanabilirim. Teşekkürler :)
Stéphane

40
hayır, fark SLaks'ın dediği gibi dönüş türüdür. Bu önemsiz değil. Performans açısından, doğrudan çıkış akışına dönüştürmenin daha iyi olduğu iddia edildi (bu yüzden başlangıçta RenderPartial boşluğu ile gitti). Kısmi testlerde çoğunlukla yararlıdır (imo), ancak SLaks'ın belirttiği gibi, çıktıyı üretim kodunda oluşturmadan önce değiştirmek istediğiniz bazı yerler olabilir. Sadece nadirdir, imo.
Paul

42
Kısmi, denetleyicideki bir görünümün çıktısını almak istediğinizde de yararlıdır. Bu, bir e-postayı biçimlendirmek için bir görünüm kullanmak için kullanılabilir.
Samg

3
@ Paul: Ne kadar çok performanstan bahsediyoruz? Taleplerin kendileriyle ilişkili herhangi bir testi veya karşılaştırması var mı? Buna gerçek et olup olmadığını veya sadece bir mikro optimizasyon olup olmadığını görmek ilginç olurdu.
Chris Pratt

1
Sahip olduğum bir soru şudur: Her ikisi de aynı dahili yöntemi çağırırsa, hangisi kullandığınızdan bağımsız olarak sonuç akışına dönüştürülür (çünkü Razor bunu yalnızca görüntülenen görünümün TextWriter'ına göndermeyi çağırmaz). biri diğerinden daha fazla performans gösterir mi? Kendi iç tamponunu (gerektiğinde kademeli olarak genişleyecek) döndürmesi nedeniyle mi? Ayrıca başka birinin e-postaları oluşturmak için görünüm modelini kullanmak için gördüğü memnunum; başka bir geliştirici bunu çok fazla yaptığımı düşündü, ancak her şeyden kaçmak zorunda olduğunuz bir dizeden daha temiz ve manipüle etmek daha kolay.
Allen Clark Copeland Jr

4

Bu Dino Esposito'nun harika bir açıklaması:

İki yöntem arasındaki fark küçük ve zararsız görünebilir, ancak nasıl ele alınacağını bilmiyorsanız size ısırır. İki yöntem arasındaki temel fark şudur:

  • Partial HTML kodlu bir dize döndürür
  • RenderPartiala, yanıt, çıkış akımına doğrudan yazar boşluk yöntemi.

İki yöntemin kullanımı biraz farklıdır:

@Html.Partial("_yourPartialView")
@{ Html.RenderPartial("_yourPartialView "); }

Hangisinin kullanılacağı, gereksinimlerinize bağlıdır. Yanıt akışında enjekte edilen dizeyi daha fazla değiştirmeniz gerekirse, kullanmalısınız Partial; Aksi halde RenderPartial doğrudan akışa gittiği için biraz daha hızlıdır Partial.

Sonunda, kısmi görüşlerin kullanım senaryoları iki kamptan birine düşmektedir. Birincisi, aşağıdaki gibi çeşitli bağımsız işaretleme parçalarını bir araya getirerek bir görünüm oluşturduğunuzda.

<body>
    @{ Html.RenderPartial("_Header"); }
    @Html.Partial("_Sidebar")
    <div class="container body-content">
       @RenderBody()
    </div>
    @{ Html.RenderPartial("_Footer"); }
</body>

Bu durumda, seçim yapma kararınız nihai etkiyi değiştirir RenderPartialveya Partialdeğiştirmez. Ancak, RenderPartialbiraz daha hızlı olduğu için kullanmayı tercih edebilirsiniz.


4
-1 Başka bir kaynaktan kopyalarken, en azından kredi verin. Bu, Pro ASP.NET MVC 3 Framework'ten (veya en azından daha yeni bir sürümden) açık bir kelime-kelime kopyasıdır.
Robotron
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.