Apa perbedaan (jika ada) antara Html.Partial (tampilan, model) dan Html.RenderPartial (tampilan, model) di MVC2?

141

Selain tipe yang dikembalikan dan fakta bahwa Anda menyebutnya berbeda tentu saja

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

Jika mereka berbeda, mengapa Anda memanggil satu daripada yang lain?
Definisi:

// 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);
    }
}
Stéphane
sumber

Jawaban:

168

Satu-satunya perbedaan adalah bahwa Partialmengembalikan suatu MvcHtmlString, dan harus dipanggil di dalam <%= %>, sedangkan RenderPartialmengembalikan voiddan merender langsung ke tampilan.

Jika Anda melihat kode sumber , Anda akan melihat bahwa keduanya memanggil metode internal yang sama, meneruskan StringWriter untuk diolah.

Anda akan menelepon Partialjika Anda ingin melihat, menyimpan, atau memanipulasi HTML yang dihasilkan alih-alih menulisnya ke halaman.

Slaks
sumber
Ok, jadi tidak ada :) seperti yang saya pikir, saya bisa menggunakannya dengan mulus, kurasa. Terima kasih :)
Stéphane
40
tidak, perbedaannya adalah tipe pengembalian, seperti kata SLaks. Ini tidak sepele. Dari segi kinerja, telah diklaim bahwa rendering langsung ke aliran output lebih baik (itulah sebabnya mereka pergi dengan kekosongan RenderPartial untuk memulai dengan). Sebagian sebagian besar berguna (imo) dalam pengujian, meskipun seperti kata SLaks mungkin ada beberapa tempat yang Anda ingin memanipulasi output sebelum membuatnya dalam kode produksi. Mereka jarang, imo.
Paul
42
Sebagian juga membantu ketika Anda ingin mendapatkan output dari tampilan di controller. Ini dapat digunakan untuk menggunakan tampilan untuk memformat email.
Samg
3
@ Paul: Berapa banyak lagi performer yang kita bicarakan? Apakah klaim memiliki pengujian atau tolok ukur yang terkait dengannya? Akan menarik untuk melihat apakah ada daging yang sebenarnya untuk ini atau jika itu hanya optimasi mikro.
Chris Pratt
1
Sebuah pertanyaan yang saya miliki adalah: keduanya akan berakhir dirender ke aliran hasil terlepas dari apa yang Anda gunakan (karena dalam Razor tidak hanya menyebutnya mengirimnya ke TextWriter view yang diberikan), jika keduanya memanggil metode internal yang sama, mengapa Apakah yang satu akan lebih berkinerja daripada yang lain? Apakah karena itu meningkatkan buffer internal sendiri (yang akan semakin berkembang sesuai kebutuhan)? Saya juga senang orang lain melihat digunakan untuk menggunakan model tampilan untuk membuat email; pengembang lain mengira saya terlalu banyak melakukannya, tetapi lebih bersih dan lebih mudah untuk dimanipulasi daripada string yang harus Anda hindari.
Allen Clark Copeland Jr
4

Ini adalah penjelasan yang bagus oleh Dino Esposito:

Perbedaan antara kedua metode ini mungkin terlihat kecil dan tidak berbahaya, tetapi mungkin menggigit Anda jika Anda tidak tahu cara menanganinya. Perbedaan utama antara kedua metode ini adalah:

  • Partial mengembalikan string yang dikodekan HTML
  • RenderPartialadalah metode void yang menulis langsung ke aliran output respons.

Penggunaan kedua metode ini sedikit berbeda:

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

Pilihan yang akan digunakan tergantung pada kebutuhan Anda. Jika Anda perlu memanipulasi string yang sedang disuntikkan dalam aliran respons, Anda harus menggunakan Partial; kalau tidak pergi dengan RenderPartial yang-hanya karena langsung ke aliran-sedikit lebih cepat daripada Partial.

Pada akhirnya, kasus penggunaan untuk pandangan sebagian jatuh di salah satu dari dua kubu. Yang pertama adalah ketika Anda membuat tampilan dengan menyusun bersama berbagai potongan markup independen, seperti di bawah ini.

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

Dalam hal ini, keputusan Anda dalam memilih antara RenderPartialatau Partialtidak mengubah efek akhir. Namun, karena RenderPartialsedikit lebih cepat, Anda mungkin lebih suka menggunakannya.

StepUp
sumber
4
-1 Saat menyalin dari sumber lain, setidaknya berikan kredit. Ini adalah salinan kata-demi-kata terang-terangan dari Pro ASP.NET MVC 3 Framework (atau setidaknya edisi yang lebih baru).
Robotron