Html.Partial ve Html.RenderPartial ve Html.Action vs Html.RenderAction


Yanıtlar:


1237

Html.Partialbir String döndürür. dahili olarak Html.RenderPartialarar Writeve geri döner void.

Temel kullanım:

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

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

Yukarıdaki snippet'te, her iki çağrı da aynı sonucu verecektir.

Html.PartialBir değişkenin çıktısını bir değişkende saklayabilir veya bir yöntemden döndürebilir , ancak bunu ile yapılamazHtml.RenderPartial .

Sonuç, Responseyürütme / değerlendirme sırasında akışa yazılacaktır .

Bu aynı zamanda uygulanır Html.Actionve Html.RenderAction.


71
Neden birini diğerinin üzerinde kullanacağını biliyor musun?
Jason

156
performans açısından burada yanıtlandığı gibi RenderPartial kullanmak daha iyidir: stackoverflow.com/questions/2729815/…
Vlad Iliescu

13
Sonucu bir değişkene kaydetme hakkında biraz teşekkür ederiz. Render muadili üzerinde Kısmi veya Eylem kullanmanın nedeni budur.
David Kassa

8
Html.Partial()Razor ile daha akıcı bir sözdizimine sahip olacak şekilde oluşturuldu. @Vlad'ın dediği gibi Html.RenderPartial(), daha verimlidir.
Tsahi Asher

2
@Tsahi, _LoginPartial için neden MVC proje şablonunda kullanıldığını açıklıyor. Teşekkürler.
Regularmike

86

@ Html.Partial öğesini üst sayfaya kopyalanan HTML kodu olarak düşünün. @ Html.RenderPartial öğesini üst sayfaya eklenmiş bir .ascx kullanıcı denetimi olarak düşünün. Bir .ascx kullanıcı kontrolünün daha fazla yükü vardır.

'@ Html.Partial' , üst öğe ile satır içi olarak oluşturulan html kodlu bir dize döndürür. Ebeveynin modeline erişir.

'@ Html.RenderPartial' , .ascx kullanıcı denetiminin eşdeğerini döndürür. Sayfanın ViewDataDictionary kendi kopyasını alır ve RenderPartial's ViewData yapılan değişiklikler üst öğenin ViewData etkilemez.

Yansımayı kullanarak şunları buluruz:

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);
}

3
Html.Partial'un Html.RenderPartial'dan daha iyi bir performansa sahip olduğunu mu söylüyorsunuz?
numaroth

15
Evet ve hayır, Html.Partial satır içi olarak işlenir ve daha az kaynak gerektirir ancak daha fazla zaman alır. Html.RenderPartial ayrı ve dolayısıyla daha hızlı oluşturulur, ancak daha fazla kaynak yoğundur. Yüksek hacimli patlama trafiğiniz varsa, kaynak kullanımını azaltmak için Html.Partial'u tercih edin. Trafik hacminde seyrek değişiklikler varsa, Html.RenderPartial'u tercih edin.
Brett Jones

4
Bence, bu tam tersi: RenderPartial, doğrudan çıkış akışına yazdığı için kesinlikle daha iyi bir performansa sahip. Kısmi dahili olarak aynı yöntemi çağırır, ancak bir MvcHtmlString olarak döndürülen ve son olarak çıktı akışına yazılan bir StringWriter'a yazar. Bu nedenle çok daha fazla bellek ayırır.
slfan

2
@BrettJones "Yoğun kaynak kullanımı" ile ne demek istiyorsun? Çünkü sadece Partialbir tampon içine görüntüleme şeklinin uyumsuz hale anlamına gelmez - tamamen zıt - Ben Sahiplenebileceğiniz nasıl göremiyorum RenderPartial"fazla kaynak tükettiği" dir.
Dai

57

İşte buldum:

Görünüme göndermek için bir modeliniz yoksa ve bir değişkende depolanması gerekmeyen geri getirmek için çok fazla html'niz varsa RenderAction'ı kullanın .

Görünüme gönderilecek bir modeliniz olmadığında ve bir değişkende depolanması gereken geri getirmek için biraz metniniz olduğunda Eylem'i kullanın .

Görünüme göndermek için bir modeliniz olduğunda RenderPartial kullanın ve bir değişkende saklanması gerekmeyen çok fazla html olacaktır.

Görünüme göndermek için bir modeliniz olduğunda Kısmi kullanın ve bir değişkente saklanması gereken biraz metin olacaktır.

RenderAction ve RenderPartial daha hızlıdır.


2
Cevaplama (Neden?) En iyi cevaptır, bu yüzden bu benim için en iyisidir.
YEH

55

Fark, ilk önce bir yanıt döndürür MvcHtmlStringancak ikinci ( Render..) çıktıları doğrudan yanıt verir.


MvcHtmlString yanıta eklenmez mi?
Shad

21

Bana göre Html.RenderPartial @Html.RenderPartial()daha hızlı yürütme var @Html.Partial()Çıkış hızlı bir yanıt verir.

Çünkü kullandığımda @Html.Partial(), web sitemin yüklenmesi daha uzun sürüyor @Html.RenderPartial()


21

@Html.Partialve @Html.RenderPartialKısmi görünüm modeliniz üst modelin yazışmasıysa kullanılır, bunu çağırmak için herhangi bir işlem yöntemi oluşturmamız gerekmez.

@Html.Actionve @Html.RenderActionsenin kısmi görünümü modeli ebeveyn modelinden bağımsız açtığınızda sayfadaki herhangi widget türü içeriği görüntülemek istediğinizde temelde kullanılır kullanılmaktadır. Yöntemi görünümden çağırırken kısmi görünüm sonucu döndüren bir eylem yöntemi oluşturmanız gerekir.


3
İyi cevap, çünkü aynı zamanda ne zaman kullanılacağını da açıklıyorsun
raklos

15

Soru hakkında daha fazla bilgi:

"Html.RenderPartial () sadece kısmi görünümün adıyla çağrıldığında, ASP.NET MVC, çağrı görünümü şablonu tarafından kullanılan Model ve ViewData sözlük nesnelerini kısmi görünüme geçirir."

Profesyonel ASP.NET MVC 1.0 gelen “NerdDinner”


9

Dönüş türü Html.RenderActionolan voiddoğrudan dönüş tipi Görünümünde tepkiler vermektedir aracının Html.Actionolduğunu MvcHtmlStringSen denetleyici onun hale görünümü yakalamak ve aşağıdaki yöntemi kullanarak değiştirebilirsiniz

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();
        }
    }

Bu, Görünüm'ün Html dizesini döndürür.

Bu ayrıca Html.PartialveHtml.RenderPartial


Html.RenderPartial ile bunu nasıl yapabilirim?
xatz

1
dönüş türü geçersiz olduğu için Html.RenderPartial kullanamayız
Namrata Jain

9

Kısmi veya RenderPartial: İşlem yöntemi oluşturmaya gerek yok. geçerli sayfanın modelinde kısmi görünümde görüntülenecek veriler zaten mevcut olduğunda kullanın.

Action veya RenderAction: Alt eylem yöntemi gerektirir. görünümde görüntülenecek verilerin bağımsız bir modeli olduğunda kullanın.


8

farklılıklar:

  1. Dönüş türü RenderPartialolduğu voidyerler gibi, Partialgeri dönüşMvcHtmlString

  2. Razor görünümlerinde çağırmak Partial()ve RenderPartial()yöntemler için sözdizimi

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

  3. Web formu görünümlerinde çağırmak için sözdizimi Partial()ve RenderPartial()yöntemler

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

Aşağıdaki ilgili 2 ortak mülakat soruları Partial()ve RenderPartial() ne zaman kullanmak istiyorsunuz Partial()üzerinde RenderPartial()tersi ve yardımcısı?

Temel fark, RenderPartial()dönüşün geçersiz olması ve çıktının doğrudan çıkış akışına yazılmasıdır; burada Partial()yöntem döndükçe MvcHtmlString, bir değişkene atanabilir ve gerekirse değiştirebilir. Bu nedenle, çıktıyı değiştirmek için bir değişkene atamak gerektiğinde, Kısmi () kullanın, aksi takdirde RenderPartial () kullanın.

Hangisi performans için daha iyidir?

Performans açısından bakıldığında, doğrudan çıktı akışına dönüştürmek daha iyidir. RenderPartial()aynı şeyi yapar ve performans için daha iyidir Partial().


5

Html.Partial: döner MvcHtmlStringve yavaş

Html.RenderPartial: çıkış akışında ve dönüşlerinde doğrudan oluşturma / yazma ve voidile karşılaştırıldığında çok hızlıHtml.Partial


3

"Kısmi" için her zaman aşağıdaki gibi kullanılır:

Bir sayfaya kontrolör aracılığıyla gitmeniz gereken bir şey varsa (Ajax çağrısında olduğu gibi) "Html.RenderPartial" kullanın.

Bir denetleyiciye tek başına bağlı olmayan ve yalnızca 'paylaşılan' klasörde olmayan bir 'statik' içeriğiniz varsa, "HTML.partial" kullanın


2

@Html.PartialHTML kodlu dizede görünüm döndürür ve aynı görünüm TextWriternesnesini kullanır. @Html.RenderPartialbu yöntem geri döner void. @Html.RenderPartialdaha hızlı@Html.Partial

Sözdizimi PartialView:

 [HttpGet] 
 public ActionResult AnyActionMethod
 {
     return PartialView();
 }
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.