ASP.NET MVC'de arasındaki fark nedir:
Html.Partial
veHtml.RenderPartial
Html.Action
veHtml.RenderAction
ASP.NET MVC'de arasındaki fark nedir:
Html.Partial
ve Html.RenderPartial
Html.Action
ve Html.RenderAction
Yanıtlar:
Html.Partial
bir String döndürür. dahili olarak Html.RenderPartial
arar Write
ve 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.Partial
Bir 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ç, Response
yürütme / değerlendirme sırasında akışa yazılacaktır .
Bu aynı zamanda uygulanır Html.Action
ve Html.RenderAction
.
Html.Partial()
Razor ile daha akıcı bir sözdizimine sahip olacak şekilde oluşturuldu. @Vlad'ın dediği gibi Html.RenderPartial()
, daha verimlidir.
@ 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);
}
Partial
bir 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.
İş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.
@Html.Partial
ve @Html.RenderPartial
Kı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.Action
ve @Html.RenderAction
senin 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.
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”
Dönüş türü Html.RenderAction
olan void
doğrudan dönüş tipi Görünümünde tepkiler vermektedir aracının Html.Action
olduğunu MvcHtmlString
Sen 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.Partial
veHtml.RenderPartial
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.
farklılıklar:
Dönüş türü RenderPartial
olduğu void
yerler gibi, Partial
geri dönüşMvcHtmlString
Razor görünümlerinde çağırmak Partial()
ve RenderPartial()
yöntemler için sözdizimi
@ Html.Partial ("PartialViewName")
@ {Html.RenderPartial ("PartialViewName"); }
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()
.
"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