อะไรคือความแตกต่าง (ถ้ามี) ระหว่าง Html.Partial (ดูรุ่น) และ Html.RenderPartial (ดูรุ่น) ใน MVC2?


141

นอกเหนือจากประเภทที่ส่งกลับและความจริงที่ว่าคุณเรียกมันแตกต่างกันแน่นอน

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

หากพวกเขาแตกต่างกันทำไมคุณถึงเรียกอันใดอันหนึ่งมากกว่าอีกอันหนึ่ง
คำจำกัดความ:

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

คำตอบ:


168

ความแตกต่างเพียงอย่างเดียวคือการPartialส่งคืนMvcHtmlStringและจะต้องเรียกว่าภายใน<%= %>ขณะที่RenderPartialผลตอบแทนvoidและการแสดงผลโดยตรงกับมุมมอง

หากคุณดูซอร์สโค้ดคุณจะเห็นว่าทั้งคู่เรียกใช้วิธีการภายในเดียวกันโดยส่งผ่าน StringWriter เพื่อให้สามารถแสดงผลได้

คุณจะโทรPartialถ้าคุณต้องการดูบันทึกหรือจัดการ HTML ที่สร้างขึ้นแทนที่จะเขียนลงในหน้า


ตกลงดังนั้นไม่มี :) ที่ฉันคิดว่าฉันสามารถใช้พวกเขาได้อย่างราบรื่นฉันเดา ขอบคุณ :)
Stéphane

40
ไม่ความแตกต่างคือประเภทส่งคืนตามที่ SLaks กล่าว นี่เป็นเรื่องไม่สำคัญ ประสิทธิภาพที่ได้รับการกล่าวอ้างว่าการแสดงผลโดยตรงกับสตรีมเอาต์พุตนั้นดีกว่า (ซึ่งเป็นสาเหตุที่พวกเขาไปด้วยโมฆะ RenderPartial เพื่อเริ่มต้น) บางส่วนมีประโยชน์ส่วนใหญ่ (imo) ในการทดสอบแม้ว่า SLAK กล่าวว่าอาจมีบางที่ที่คุณต้องการจัดการเอาต์พุตก่อนที่จะแสดงผลในรหัสการผลิต พวกมันเป็นของหายาก imo
พอล

42
บางส่วนยังมีประโยชน์เมื่อคุณต้องการรับเอาต์พุตของมุมมองในคอนโทรลเลอร์ สิ่งนี้สามารถใช้เพื่อใช้มุมมองเพื่อจัดรูปแบบอีเมล
Samg

3
@ พอล: เราพูดถึงนักแสดงมากแค่ไหน? การอ้างสิทธิ์มีการทดสอบหรือการเปรียบเทียบที่เกี่ยวข้องหรือไม่? มันน่าสนใจที่จะดูว่ามีเนื้อจริงหรือไม่หรือเป็นการเพิ่มประสิทธิภาพแบบไมโคร
Chris Pratt

1
คำถามที่ฉันมีคือ: ทั้งคู่จะถูกแสดงผลไปยังสตรีมผลลัพธ์โดยไม่คำนึงถึงสิ่งที่คุณใช้ (เนื่องจากใน Razor ไม่เพียงเรียกมันว่าส่งไปยัง TextWriter ของมุมมองที่แสดงผล) หากทั้งคู่เรียกวิธีภายในเดียวกัน จะมีนักแสดงมากกว่าคนอื่นหรือไม่ มันเป็นเพราะมันหมุนบัฟเฟอร์ภายในของตัวเอง (ซึ่งจะขยายอย่างต่อเนื่องตามความจำเป็น)? นอกจากนี้ฉันดีใจที่มีคนอื่นเห็นใช้ในการใช้รูปแบบมุมมองในการแสดงอีเมล นักพัฒนาคนอื่นคิดว่าฉันทำไปแล้ว แต่มันก็สะอาดกว่าและใช้งานง่ายกว่าสตริงที่คุณต้องหลบหนีทุกอย่าง
Allen Clark Copeland Jr

4

นี่คือคำอธิบายที่ยอดเยี่ยมโดย Dino Esposito:

ความแตกต่างระหว่างสองวิธีอาจดูเล็กและไม่เป็นอันตราย แต่มันอาจกัดคุณถ้าคุณไม่รู้วิธีจัดการ ความแตกต่างที่สำคัญระหว่างสองวิธีคือ:

  • Partial ส่งคืนสตริงที่เข้ารหัส HTML
  • RenderPartialเป็นวิธีการโมฆะที่เขียนโดยตรงไปยังกระแสข้อมูลการตอบสนอง

การใช้งานของทั้งสองวิธีจะแตกต่างกันเล็กน้อย:

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

ทางเลือกที่จะใช้ขึ้นอยู่กับความต้องการของคุณ หากคุณจำเป็นต้องจัดการต่อไปสตริงที่ถูกฉีดในกระแสการตอบสนองคุณควรใช้Partial; ไม่อย่างนั้นก็ไปหาRenderPartial อันไหน - เพียงเพราะมันตรงไปที่กระแส - เร็วกว่าPartialเล็กน้อย

ในท้ายที่สุดกรณีการใช้งานสำหรับมุมมองบางส่วนจะอยู่ในสองค่าย อย่างแรกคือเมื่อคุณสร้างมุมมองโดยเขียนมาร์กอัปชิ้นอิสระหลายชิ้นไว้ด้วยกันดังนี้

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

ในกรณีนี้การตัดสินใจของคุณในการเลือกระหว่างRenderPartialหรือ Partialไม่เปลี่ยนผลสุดท้าย อย่างไรก็ตามเนื่องจาก RenderPartialเร็วกว่าเล็กน้อยคุณอาจต้องการใช้งาน


4
-1 เมื่อคัดลอกจากแหล่งอื่นอย่างน้อยก็ให้เครดิต นี่คือการคัดลอกคำต่อคำที่โจ่งแจ้งจาก Pro ASP.NET MVC 3 Framework (หรือรุ่นที่ใหม่กว่าอย่างน้อย)
Robotron
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.