Html.Partial vs Html.RenderPartial & Html.Action vs Html.RenderAction

Jawaban:

1237

Html.Partialmengembalikan sebuah String. Html.RenderPartialpanggilan Writeinternal dan kembali void.

Penggunaan dasar adalah:

// Razor syntax
@Html.Partial("ViewName")
@{ Html.RenderPartial("ViewName");  }

// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>

Dalam cuplikan di atas, kedua panggilan akan menghasilkan hasil yang sama.

Sementara seseorang dapat menyimpan output Html.Partialdalam variabel atau mengembalikannya dari suatu metode, seseorang tidak dapat melakukan ini dengan Html.RenderPartial.

Hasilnya akan ditulis ke Responsealiran selama eksekusi / evaluasi.

Ini juga berlaku untuk Html.Actiondan Html.RenderAction.

GvS
sumber
71
Apakah Anda tahu mengapa Anda akan menggunakan yang satu?
Jason
156
kinerja-bijaksana lebih baik menggunakan RenderPartial, seperti yang dijawab di sini: stackoverflow.com/questions/2729815/…
Vlad Iliescu
13
Terima kasih atas sedikit tentang menyimpan hasil ke dalam variabel. Ini adalah alasan untuk menggunakan Sebagian atau Tindakan atas mitra Render.
David Kassa
8
Html.Partial()diciptakan untuk memiliki sintaks yang lebih lancar dengan Razor. Seperti yang dikatakan @Vlad, Html.RenderPartial()lebih efisien.
Tsahi Asher
2
@Tsahi yang menjelaskan mengapa ini digunakan dalam template proyek MVC untuk _LoginPartial. Terima kasih.
regularmike
86

Pikirkan @ Html.Partial sebagai kode HTML yang disalin ke halaman induk. Pikirkan @ Html.RenderPartial sebagai kontrol pengguna .ascx yang dimasukkan ke halaman induk. Kontrol pengguna .ascx memiliki overhead yang jauh lebih besar.

'@ Html.Partial' mengembalikan string yang disandikan html yang dibuat sesuai dengan induknya. Ini mengakses model orang tua.

'@ Html.RenderPartial' mengembalikan setara dengan kontrol pengguna .ascx. Itu mendapatkan salinannya sendiri dari ViewDataDictionary halaman dan perubahan yang dibuat untuk ViewData RenderPartial tidak mempengaruhi ViewData induknya.

Menggunakan refleksi kami menemukan:

public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model, ViewDataDictionary viewData)
{
    MvcHtmlString mvcHtmlString;
    using (StringWriter stringWriter = new StringWriter(CultureInfo.CurrentCulture))
    {
        htmlHelper.RenderPartialInternal(partialViewName, viewData, model, stringWriter, ViewEngines.Engines);
        mvcHtmlString = MvcHtmlString.Create(stringWriter.ToString());
    }
    return mvcHtmlString;
}

public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName)
{
    htmlHelper.RenderPartialInternal(partialViewName, htmlHelper.ViewData, null, htmlHelper.ViewContext.Writer, ViewEngines.Engines);
}
Brett Jones
sumber
3
Apakah Anda mengatakan bahwa Html.Partial memiliki kinerja yang lebih baik daripada Html.RenderPartial?
numaroth
15
Ya dan tidak, Html.Partial dirender sebaris dan kurang sumber daya intensif tetapi lebih memakan waktu. Html.RenderPartial dirender secara terpisah dan karenanya lebih cepat, tetapi lebih intensif sumber daya. Jika Anda memiliki volume tinggi lalu lintas burst mendukung Html.Partial untuk mengurangi penggunaan sumber daya. Jika Anda memiliki perubahan volume lalu lintas yang jarang mendukung Html.RenderPartial.
Brett Jones
4
Menurut saya, ini sebaliknya: RenderPartial pasti memiliki kinerja yang lebih baik karena ia menulis langsung ke arus keluaran. Sebagian memanggil metode yang sama secara internal, tetapi menulis ke dalam StringWriter yang dikembalikan sebagai MvcHtmlString dan akhirnya ditulis ke aliran output. Karena itu ia mengalokasikan lebih banyak memori.
slfan
2
@ BrettJones Apa yang Anda maksud dengan "sumber daya intensif"? Hanya karena Partialmerender ke dalam buffer tidak berarti itu dirender secara tidak sinkron - justru sebaliknya - saya tidak dapat melihat bagaimana Anda dapat mengklaim RenderPartial"lebih intensif sumber daya".
Dai
57

Inilah yang saya temukan:

Gunakan RenderAction ketika Anda tidak memiliki model untuk dikirim ke tampilan dan memiliki banyak html untuk mengembalikan yang tidak perlu disimpan dalam variabel.

Gunakan Aksi ketika Anda tidak memiliki model untuk dikirim ke tampilan dan memiliki sedikit teks untuk membawa kembali yang perlu disimpan dalam variabel.

Gunakan RenderPartial ketika Anda memiliki model untuk dikirim ke tampilan dan akan ada banyak html yang tidak perlu disimpan dalam variabel.

Gunakan Parsial ketika Anda memiliki model untuk dikirim ke tampilan dan akan ada sedikit teks yang perlu disimpan dalam variabel.

RenderAction dan RenderPartial lebih cepat.

David
sumber
2
Menjawab (Kenapa?) Adalah jawaban terbaik jadi ini yang terbaik untuk saya.
YEH
55

Perbedaan adalah yang pertama mengembalikan hasil MvcHtmlStringtetapi yang kedua ( Render..) langsung ke respons.

Aliostad
sumber
tidakkah MvcHtmlString juga ditambahkan ke respons?
Shad
21

Menurut saya @Html.RenderPartial()eksekusi lebih cepat daripada @Html.Partial()karena Html.RenderPartial memberikan respon cepat terhadap Output.

Karena ketika saya gunakan @Html.Partial(), situs web saya membutuhkan waktu lebih lama untuk memuat dibandingkan @Html.RenderPartial()

iChirag
sumber
21

@Html.Partialdan @Html.RenderPartialdigunakan ketika model tampilan sebagian Anda adalah korespondensi dari model induk, kami tidak perlu membuat metode tindakan apa pun untuk memanggil ini.

@Html.Actiondan @Html.RenderActiondigunakan ketika model tampilan parsial Anda terpisah dari model induk, pada dasarnya ini digunakan ketika Anda ingin menampilkan konten jenis widget apa pun di halaman. Anda harus membuat metode tindakan yang mengembalikan hasil tampilan sebagian saat memanggil metode dari tampilan.

Jayesh Patel
sumber
3
Jawaban yang bagus, karena Anda juga menjelaskan kapan harus menggunakan Partial over Action
raklos
15

Lebih lanjut tentang pertanyaan:

"Ketika Html.RenderPartial () dipanggil hanya dengan nama tampilan parsial, ASP.NET MVC akan meneruskan ke tampilan parsial objek Model dan kamus ViewData yang sama yang digunakan oleh templat tampilan panggilan."

“NerdDinner” dari Professional ASP.NET MVC 1.0

Ygor Thomaz
sumber
9

Tipe kembalinya Html.RenderActionadalah voidyang berarti secara langsung merender respons dalam tampilan di mana tipe kembalinya Html.Actionadalah MvcHtmlStringAnda dapat menangkap tampilan render di controller dan memodifikasinya dengan menggunakan metode berikut

protected string RenderPartialViewToString(string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = ControllerContext.RouteData.GetRequiredString("action");

        ViewData.Model = model;

        using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
            return sw.GetStringBuilder().ToString();
        }
    }

Ini akan mengembalikan string Html dari View.

Ini juga berlaku untuk Html.PartialdanHtml.RenderPartial

Shivkumar
sumber
Bagaimana saya bisa melakukan ini dengan Html.RenderPartial?
xatz
1
kita tidak bisa menggunakan Html.RenderPartial karena tipe pengembaliannya tidak valid
Namrata Jain
9

Partial or RenderPartial: Tidak perlu membuat metode tindakan. gunakan ketika data yang akan ditampilkan pada tampilan parsial sudah ada dalam model halaman saat ini.

Tindakan atau RenderAction: Membutuhkan metode tindakan anak. gunakan ketika data untuk ditampilkan pada tampilan memiliki model independen.

Anil
sumber
8

Perbedaan:

  1. Jenis pengembalian RenderPartialadalah void, di mana sebagai PartialpengembalianMvcHtmlString

  2. Sintaks untuk memohon Partial()dan RenderPartial()metode dalam tampilan Razor

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

  3. Sintaks untuk memohon Partial()dan RenderPartial()metode dalam tampilan formulir web

[%: Html.Partial ("PartialViewName")%]
[% Html.RenderPartial ("PartialViewName"); %]

Berikut ini adalah 2 pertanyaan wawancara umum terkait Partial()dan RenderPartial() Kapan Anda akan menggunakan Partial()lebih RenderPartial()dan sebaliknya?

Perbedaan utama adalah bahwa RenderPartial()mengembalikan void dan output akan ditulis langsung ke aliran output, sedangkan Partial()metode yang dikembalikan MvcHtmlString, yang dapat ditugaskan ke variabel dan memanipulasi jika diperlukan. Jadi, ketika ada kebutuhan untuk menetapkan output ke variabel untuk memanipulasinya, kemudian gunakan Partial (), kalau tidak gunakan RenderPartial ().

Mana yang lebih baik untuk kinerja?

Dari perspektif kinerja, rendering langsung ke aliran output lebih baik. RenderPartial()melakukan hal yang persis sama dan lebih baik untuk kinerja selesai Partial().

Nazmul Hasan
sumber
5

Html.Partial: kembali MvcHtmlStringdan lambat

Html.RenderPartial: langsung membuat / menulis pada aliran keluaran dan kembali voiddan sangat cepat dibandingkan denganHtml.Partial

Navneet
sumber
3

Untuk "sebagian" saya selalu menggunakannya sebagai berikut:

Jika ada sesuatu yang perlu Anda sertakan dalam halaman yang harus Anda lewati melalui pengontrol (seperti yang Anda lakukan dengan panggilan Ajax) kemudian gunakan "Html.RenderPartial".

Jika Anda memiliki 'statis' termasuk yang tidak ditautkan ke controller per-se dan hanya di folder 'bersama' misalnya, gunakan "HTML.partial"

scgough
sumber
2

@Html.Partialmengembalikan tampilan dalam string yang dikodekan-HTML dan menggunakan TextWriterobjek tampilan yang sama . @Html.RenderPartialmetode ini kembali void. @Html.RenderPartiallebih cepat dari@Html.Partial

Sintaks untuk PartialView:

 [HttpGet] 
 public ActionResult AnyActionMethod
 {
     return PartialView();
 }
Mayank
sumber