ใน ASP.NET MVC ความแตกต่างระหว่าง:
Html.PartialและHtml.RenderPartialHtml.ActionและHtml.RenderAction
ใน ASP.NET MVC ความแตกต่างระหว่าง:
Html.Partial และ Html.RenderPartialHtml.Action และ Html.RenderActionคำตอบ:
Html.Partialส่งคืนสตริง Html.RenderPartialโทรภายในและผลตอบแทนWritevoid
การใช้งานพื้นฐานคือ:
// Razor syntax
@Html.Partial("ViewName")
@{ Html.RenderPartial("ViewName"); }
// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>
ในตัวอย่างด้านบนการโทรทั้งสองแบบจะให้ผลลัพธ์เหมือนกัน
ขณะที่หนึ่งสามารถเก็บการส่งออกของHtml.Partialในตัวแปรหรือส่งกลับมาจากวิธีการอย่างใดอย่างหนึ่งไม่สามารถHtml.RenderPartialทำเช่นนี้กับ
ผลลัพธ์จะถูกเขียนไปยังResponseสตรีมระหว่างการดำเนินการ / การประเมินผล
นอกจากนี้ยังนำไปใช้และHtml.ActionHtml.RenderAction
Html.Partial()ถูกสร้างขึ้นเพื่อให้มีไวยากรณ์ที่คล่องแคล่วยิ่งขึ้นด้วยมีดโกน อย่างที่ @Vlad บอกว่าHtml.RenderPartial()มีประสิทธิภาพมากกว่า
คิดว่า @ Html.Partial เป็นรหัส HTML ที่คัดลอกไปยังหน้าหลัก คิดว่า @ Html.RenderPartial เป็นส่วนควบคุมผู้ใช้ .ascx ที่รวมอยู่ในเพจระดับบน การควบคุมผู้ใช้ .ascx มีค่าใช้จ่ายมากกว่า
'@ Html.Partial'ส่งคืนสตริงที่เข้ารหัส html ที่สร้างขึ้นแบบอินไลน์กับพาเรนต์ มันเข้าถึงโมเดลของผู้ปกครอง
'@ Html.RenderPartial'จะคืนค่าเทียบเท่ากับการควบคุมผู้ใช้. asx ได้รับสำเนาของ ViewDataDictionary ของหน้าและการเปลี่ยนแปลงที่ทำกับ ViewData ของ RenderPartial จะไม่มีผลกับ ViewData ของพาเรนต์
ใช้การสะท้อนที่เราพบ:
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แสดงผลเป็นบัฟเฟอร์ไม่ได้หมายความว่ามันแสดงผลแบบอะซิงโครนัส - ค่อนข้างตรงกันข้าม - ฉันไม่เห็นว่าคุณจะอ้างสิทธิ์ได้อย่างไรRenderPartialคือ "ใช้ทรัพยากรมากขึ้น"
นี่คือสิ่งที่ฉันได้พบ:
ใช้RenderActionเมื่อคุณไม่มีโมเดลที่จะส่งไปยังมุมมองและมี html จำนวนมากเพื่อนำกลับมาซึ่งไม่จำเป็นต้องเก็บไว้ในตัวแปร
ใช้การดำเนินการเมื่อคุณไม่มีโมเดลที่จะส่งไปยังมุมมองและมีข้อความเล็กน้อยที่จะนำกลับมาซึ่งจะต้องเก็บไว้ในตัวแปร
ใช้RenderPartialเมื่อคุณมีแบบจำลองเพื่อส่งไปยังมุมมองและจะมี html จำนวนมากที่ไม่จำเป็นต้องเก็บไว้ในตัวแปร
ใช้บางส่วนเมื่อคุณมีแบบจำลองเพื่อส่งไปยังมุมมองและจะมีข้อความเล็กน้อยที่ต้องเก็บไว้ในตัวแปร
RenderActionและRenderPartialเร็วขึ้น
ความแตกต่างคือครั้งแรกที่หนึ่งส่งคืนMvcHtmlStringแต่วินาที ( Render..) เอาท์พุทตรงไปยังการตอบสนอง
ตามที่ฉัน@Html.RenderPartial()มีการดำเนินการเร็วกว่า@Html.Partial()เนื่องจาก Html.RenderPartial ให้การตอบสนองอย่างรวดเร็วต่อการส่งออก
เพราะเมื่อฉันใช้@Html.Partial()เว็บไซต์ของฉันจะใช้เวลาโหลดมากกว่าเมื่อเทียบกับ @Html.RenderPartial()
@Html.Partialและ@Html.RenderPartialจะถูกใช้เมื่อโมเดลมุมมองบางส่วนของคุณมีความสอดคล้องกับโมเดลพาเรนต์เราไม่จำเป็นต้องสร้างวิธีการใด ๆ เพื่อเรียกสิ่งนี้
@Html.Actionและ@Html.RenderActionจะใช้เมื่อโมเดลมุมมองบางส่วนของคุณเป็นอิสระจากโมเดลพาเรนต์โดยทั่วไปจะใช้เมื่อคุณต้องการแสดงเนื้อหาประเภทวิดเจ็ตใด ๆ ในหน้า คุณต้องสร้างวิธีการดำเนินการซึ่งส่งกลับผลลัพธ์มุมมองบางส่วนขณะเรียกใช้เมธอดจากมุมมอง
เพิ่มเติมเกี่ยวกับคำถาม:
"เมื่อ Html.RenderPartial () ถูกเรียกด้วยชื่อมุมมองบางส่วน ASP.NET MVC จะส่งผ่านมุมมองบางส่วนของวัตถุพจนานุกรมรุ่นและ ViewData เดียวกันที่ใช้โดยแม่แบบมุมมองการโทร"
“ NerdDinner” จาก Professional ASP.NET MVC 1.0
ประเภทการคืนค่าของHtml.RenderActionคือvoidหมายความว่ามันแสดงผลการตอบสนองโดยตรงในมุมมองที่ประเภทการส่งคืนของHtml.Actionคือ MvcHtmlStringคุณสามารถจับมุมมองการแสดงผลในตัวควบคุมและปรับเปลี่ยนโดยใช้วิธีการดังต่อไปนี้
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();
}
}
นี่จะส่งคืนสตริง Html ของมุมมอง
นอกจากนี้ยังใช้กับHtml.PartialและHtml.RenderPartial
บางส่วนหรือ RenderPartial:ไม่จำเป็นต้องสร้างวิธีการกระทำ ใช้เมื่อข้อมูลที่จะแสดงในมุมมองบางส่วนมีอยู่แล้วในรูปแบบของหน้าปัจจุบัน
การกระทำหรือ RenderAction:ต้องใช้วิธีการกระทำของเด็ก ใช้เมื่อข้อมูลที่จะแสดงบนมุมมองมีรูปแบบอิสระ
แตกต่าง:
ประเภทส่งคืนของRenderPartialคือvoidที่ไหนเป็นPartialผลตอบแทนMvcHtmlString
ไวยากรณ์สำหรับการเรียกใช้Partial()และRenderPartial()เมธอดในมุมมองมีดโกน
@ Html.Partial ("PartialViewName")
@ {Html.RenderPartial ("PartialViewName"); }
ไวยากรณ์สำหรับการเรียกใช้Partial()และRenderPartial()เมธอดในมุมมองฟอร์มเว็บ
[%: Html.Partial ("PartialViewName")%]
[% Html.RenderPartial ("PartialViewName"); %]
ต่อไปนี้เป็นคำถามสัมภาษณ์ร่วมกัน 2 ท่านที่เกี่ยวข้องกับการPartial()และRenderPartial()
เมื่อคุณจะใช้Partial()มากกว่าRenderPartial()และในทางกลับกัน?
ความแตกต่างที่สำคัญคือการRenderPartial()คืนค่าเป็นโมฆะและผลลัพธ์จะถูกเขียนโดยตรงไปยังกระแสข้อมูลขาออกซึ่งเป็นPartial()วิธีการส่งกลับMvcHtmlStringซึ่งสามารถกำหนดให้กับตัวแปรและจัดการกับมันถ้าจำเป็น ดังนั้นเมื่อมีความจำเป็นต้องกำหนดเอาท์พุทให้กับตัวแปรสำหรับจัดการมันให้ใช้ Partial () มิฉะนั้นจะใช้ RenderPartial ()
อันไหนดีกว่าสำหรับประสิทธิภาพ?
จากมุมมองด้านประสิทธิภาพการเรนเดอร์โดยตรงไปยังสตรีมเอาต์พุต ไม่ตรงกับสิ่งเดียวกันและจะดีกว่าเพื่อให้ได้ประสิทธิภาพมากกว่าRenderPartial()Partial()
Html.Partial: ผลตอบแทนMvcHtmlStringและช้า
Html.RenderPartial: เรนเดอร์โดยตรง / เขียนบนเอาต์พุตสตรีมและส่งคืนvoidและยังเร็วมากHtml.Partial
สำหรับ "บางส่วน" ฉันมักจะใช้ดังนี้:
หากมีบางสิ่งที่คุณต้องรวมไว้ในหน้าเว็บที่คุณต้องผ่านตัวควบคุม (เช่นเดียวกับการโทรด้วย Ajax) จากนั้นใช้ "Html.RenderPartial"
หากคุณมีการรวม 'คงที่' ที่ไม่ได้เชื่อมโยงกับตัวควบคุมต่อและในโฟลเดอร์ 'ที่ใช้ร่วมกัน' ตัวอย่างเช่นใช้ "HTML.partial"
@Html.Partialส่งคืนมุมมองในสตริงที่เข้ารหัส HTML และใช้TextWriterวัตถุ
มุมมองเดียวกัน การกลับมาวิธีการนี้
@Html.RenderPartial เร็วกว่าvoid@Html.RenderPartial@Html.Partial
ไวยากรณ์สำหรับPartialView:
[HttpGet]
public ActionResult AnyActionMethod
{
return PartialView();
}