Html.Partial เทียบกับ Html.RenderPartial & Html.Action เทียบกับ Html.RenderAction


คำตอบ:


1237

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


71
คุณรู้หรือไม่ว่าทำไมคุณถึงต้องใช้อันอื่น?
เจสัน

156
ประสิทธิภาพควรใช้ RenderPartial ตามที่ได้รับคำตอบไว้ที่นี่: stackoverflow.com/questions/2729815/…
Vlad Iliescu

13
ขอบคุณสำหรับข้อมูลเล็กน้อยเกี่ยวกับการเก็บผลลัพธ์ไว้ในตัวแปร นี่คือเหตุผลที่ใช้ Partial หรือ Action มากกว่า Render
David Kassa

8
Html.Partial()ถูกสร้างขึ้นเพื่อให้มีไวยากรณ์ที่คล่องแคล่วยิ่งขึ้นด้วยมีดโกน อย่างที่ @Vlad บอกว่าHtml.RenderPartial()มีประสิทธิภาพมากกว่า
Tsahi Asher

2
@Tsahi ที่อธิบายว่าทำไมจึงใช้ในเทมเพลตโครงการ MVC สำหรับ _LoginPartial ขอบคุณ
regularmike

86

คิดว่า @ 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);
}

3
คุณกำลังบอกว่า Html.Partial มีประสิทธิภาพที่ดีกว่า Html.RenderPartial หรือไม่
numaroth

15
ใช่และไม่ใช่ Html.Partial มีการแสดงผลแบบอินไลน์และใช้ทรัพยากรน้อยลง แต่ใช้เวลานานกว่า Html.RenderPartial มีการเรนเดอร์แยกต่างหากดังนั้นจึงเร็วขึ้น แต่มีทรัพยากรมากขึ้น หากคุณมีปริมาณการใช้ข้อมูลปริมาณมาก Html.Partial เพื่อลดการใช้ทรัพยากร หากคุณมีการเปลี่ยนแปลงที่ไม่บ่อยนักในปริมาณการเข้าชม Html.RenderPartial
Brett Jones

4
ในความคิดของฉันมันเป็นวิธีอื่น: RenderPartial มีประสิทธิภาพที่ดีขึ้นอย่างแน่นอนเนื่องจากมันเขียนไปยังสตรีมเอาต์พุตโดยตรง บางส่วนเรียกวิธีการเดียวกันภายใน แต่เขียนลงใน StringWriter ซึ่งถูกส่งคืนเป็น MvcHtmlString และในที่สุดก็เขียนลงในเอาต์พุตสตรีม ดังนั้นจึงจัดสรรหน่วยความจำได้มากขึ้น
slfan

2
@BrettJones คุณหมายถึงอะไรโดย "ทรัพยากรเข้มข้น"? เพียงเพราะการPartialแสดงผลเป็นบัฟเฟอร์ไม่ได้หมายความว่ามันแสดงผลแบบอะซิงโครนัส - ค่อนข้างตรงกันข้าม - ฉันไม่เห็นว่าคุณจะอ้างสิทธิ์ได้อย่างไรRenderPartialคือ "ใช้ทรัพยากรมากขึ้น"
ได

57

นี่คือสิ่งที่ฉันได้พบ:

ใช้RenderActionเมื่อคุณไม่มีโมเดลที่จะส่งไปยังมุมมองและมี html จำนวนมากเพื่อนำกลับมาซึ่งไม่จำเป็นต้องเก็บไว้ในตัวแปร

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

ใช้RenderPartialเมื่อคุณมีแบบจำลองเพื่อส่งไปยังมุมมองและจะมี html จำนวนมากที่ไม่จำเป็นต้องเก็บไว้ในตัวแปร

ใช้บางส่วนเมื่อคุณมีแบบจำลองเพื่อส่งไปยังมุมมองและจะมีข้อความเล็กน้อยที่ต้องเก็บไว้ในตัวแปร

RenderActionและRenderPartialเร็วขึ้น


2
การตอบรับ (เพราะเหตุใด) เป็นคำตอบที่ดีที่สุดดังนั้นนี่จึงเป็นสิ่งที่ดีที่สุดสำหรับฉัน
YEH

55

ความแตกต่างคือครั้งแรกที่หนึ่งส่งคืนMvcHtmlStringแต่วินาที ( Render..) เอาท์พุทตรงไปยังการตอบสนอง


MvcHtmlString จะไม่ถูกเพิ่มในการตอบกลับด้วยหรือไม่
Shad

21

ตามที่ฉัน@Html.RenderPartial()มีการดำเนินการเร็วกว่า@Html.Partial()เนื่องจาก Html.RenderPartial ให้การตอบสนองอย่างรวดเร็วต่อการส่งออก

เพราะเมื่อฉันใช้@Html.Partial()เว็บไซต์ของฉันจะใช้เวลาโหลดมากกว่าเมื่อเทียบกับ @Html.RenderPartial()


21

@Html.Partialและ@Html.RenderPartialจะถูกใช้เมื่อโมเดลมุมมองบางส่วนของคุณมีความสอดคล้องกับโมเดลพาเรนต์เราไม่จำเป็นต้องสร้างวิธีการใด ๆ เพื่อเรียกสิ่งนี้

@Html.Actionและ@Html.RenderActionจะใช้เมื่อโมเดลมุมมองบางส่วนของคุณเป็นอิสระจากโมเดลพาเรนต์โดยทั่วไปจะใช้เมื่อคุณต้องการแสดงเนื้อหาประเภทวิดเจ็ตใด ๆ ในหน้า คุณต้องสร้างวิธีการดำเนินการซึ่งส่งกลับผลลัพธ์มุมมองบางส่วนขณะเรียกใช้เมธอดจากมุมมอง


3
คำตอบที่ดีเพราะคุณยังต้องอธิบายเมื่อใช้ Partial over Action
raklos

15

เพิ่มเติมเกี่ยวกับคำถาม:

"เมื่อ Html.RenderPartial () ถูกเรียกด้วยชื่อมุมมองบางส่วน ASP.NET MVC จะส่งผ่านมุมมองบางส่วนของวัตถุพจนานุกรมรุ่นและ ViewData เดียวกันที่ใช้โดยแม่แบบมุมมองการโทร"

“ NerdDinner” จาก Professional ASP.NET MVC 1.0


9

ประเภทการคืนค่าของ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


ฉันจะทำสิ่งนี้กับ Html.RenderPartial ได้อย่างไร
xatz

1
เราไม่สามารถใช้ Html.RenderPartial ได้เนื่องจากประเภทการคืนเป็นโมฆะ
Namrata Jain

9

บางส่วนหรือ RenderPartial:ไม่จำเป็นต้องสร้างวิธีการกระทำ ใช้เมื่อข้อมูลที่จะแสดงในมุมมองบางส่วนมีอยู่แล้วในรูปแบบของหน้าปัจจุบัน

การกระทำหรือ RenderAction:ต้องใช้วิธีการกระทำของเด็ก ใช้เมื่อข้อมูลที่จะแสดงบนมุมมองมีรูปแบบอิสระ


8

แตกต่าง:

  1. ประเภทส่งคืนของRenderPartialคือvoidที่ไหนเป็นPartialผลตอบแทนMvcHtmlString

  2. ไวยากรณ์สำหรับการเรียกใช้Partial()และRenderPartial()เมธอดในมุมมองมีดโกน

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

  3. ไวยากรณ์สำหรับการเรียกใช้Partial()และRenderPartial()เมธอดในมุมมองฟอร์มเว็บ

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

ต่อไปนี้เป็นคำถามสัมภาษณ์ร่วมกัน 2 ท่านที่เกี่ยวข้องกับการPartial()และRenderPartial() เมื่อคุณจะใช้Partial()มากกว่าRenderPartial()และในทางกลับกัน?

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

อันไหนดีกว่าสำหรับประสิทธิภาพ?

จากมุมมองด้านประสิทธิภาพการเรนเดอร์โดยตรงไปยังสตรีมเอาต์พุต ไม่ตรงกับสิ่งเดียวกันและจะดีกว่าเพื่อให้ได้ประสิทธิภาพมากกว่าRenderPartial()Partial()


5

Html.Partial: ผลตอบแทนMvcHtmlStringและช้า

Html.RenderPartial: เรนเดอร์โดยตรง / เขียนบนเอาต์พุตสตรีมและส่งคืนvoidและยังเร็วมากHtml.Partial


3

สำหรับ "บางส่วน" ฉันมักจะใช้ดังนี้:

หากมีบางสิ่งที่คุณต้องรวมไว้ในหน้าเว็บที่คุณต้องผ่านตัวควบคุม (เช่นเดียวกับการโทรด้วย Ajax) จากนั้นใช้ "Html.RenderPartial"

หากคุณมีการรวม 'คงที่' ที่ไม่ได้เชื่อมโยงกับตัวควบคุมต่อและในโฟลเดอร์ 'ที่ใช้ร่วมกัน' ตัวอย่างเช่นใช้ "HTML.partial"


2

@Html.Partialส่งคืนมุมมองในสตริงที่เข้ารหัส HTML และใช้TextWriterวัตถุ มุมมองเดียวกัน การกลับมาวิธีการนี้ @Html.RenderPartial เร็วกว่าvoid@Html.RenderPartial@Html.Partial

ไวยากรณ์สำหรับPartialView:

 [HttpGet] 
 public ActionResult AnyActionMethod
 {
     return PartialView();
 }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.