ใน ASP.NET MVC ความแตกต่างระหว่าง:
Html.Partial
และHtml.RenderPartial
Html.Action
และHtml.RenderAction
ใน ASP.NET MVC ความแตกต่างระหว่าง:
Html.Partial
และ Html.RenderPartial
Html.Action
และ Html.RenderAction
คำตอบ:
Html.Partial
ส่งคืนสตริง Html.RenderPartial
โทรภายในและผลตอบแทนWrite
void
การใช้งานพื้นฐานคือ:
// Razor syntax
@Html.Partial("ViewName")
@{ Html.RenderPartial("ViewName"); }
// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>
ในตัวอย่างด้านบนการโทรทั้งสองแบบจะให้ผลลัพธ์เหมือนกัน
ขณะที่หนึ่งสามารถเก็บการส่งออกของHtml.Partial
ในตัวแปรหรือส่งกลับมาจากวิธีการอย่างใดอย่างหนึ่งไม่สามารถHtml.RenderPartial
ทำเช่นนี้กับ
ผลลัพธ์จะถูกเขียนไปยังResponse
สตรีมระหว่างการดำเนินการ / การประเมินผล
นอกจากนี้ยังนำไปใช้และHtml.Action
Html.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();
}