Sự khác biệt (nếu có) giữa Html.Partial (view, model) và Html.RenderPartial (view, model) trong MVC2 là gì?


141

Khác với loại nó trả về và thực tế là bạn gọi nó là khác nhau tất nhiên

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

Nếu chúng khác nhau, tại sao bạn lại gọi cái này chứ không phải cái kia?
Các định nghĩa:

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

Câu trả lời:


168

Sự khác biệt duy nhất là Partialtrả về một MvcHtmlString, và phải được gọi bên trong <%= %>, trong khi RenderPartialtrả về voidvà hiển thị trực tiếp cho khung nhìn.

Nếu bạn nhìn vào mã nguồn , bạn sẽ thấy rằng cả hai đều gọi cùng một phương thức nội bộ, truyền StringWriter cho nó để kết xuất.

Bạn sẽ gọi Partialnếu bạn muốn xem, lưu hoặc thao tác với HTML được tạo thay vì viết nó lên trang.


Ok, vậy không có gì cả :) như tôi nghĩ, tôi có thể sử dụng chúng một cách liền mạch tôi đoán. Cảm ơn :)
Stéphane

40
không, sự khác biệt là loại trả lại, như SLaks nói. Điều này là không tầm thường. Hiệu suất khôn ngoan, người ta đã tuyên bố rằng kết xuất trực tiếp vào luồng đầu ra là tốt hơn (đó là lý do tại sao họ bắt đầu với khoảng trống RenderPartial để bắt đầu). Một phần chủ yếu là hữu ích (imo) trong thử nghiệm, mặc dù như SLaks cho biết có thể có một số nơi bạn muốn thao tác đầu ra trước khi hiển thị nó trong mã sản xuất. Họ chỉ là hiếm, imo.
Paul

42
Một phần cũng hữu ích khi bạn muốn có được đầu ra của một khung nhìn trong bộ điều khiển. Điều này có thể được sử dụng để sử dụng chế độ xem để định dạng email.
Samg

3
@Paul: Chúng ta đang nói nhiều hơn bao nhiêu? Các yêu cầu có bất kỳ thử nghiệm hoặc điểm chuẩn liên quan đến chúng? Sẽ rất thú vị để xem nếu có thịt thực sự cho điều này hoặc nếu nó chỉ là một tối ưu hóa vi mô.
Chris Pratt

1
Một câu hỏi tôi có là: cả hai cuối cùng sẽ được hiển thị cho luồng kết quả bất kể bạn sử dụng cái gì (vì trong Dao cạo không chỉ gọi nó gửi đến TextWriter của khung nhìn được hiển thị), nếu cả hai đều gọi cùng một phương thức bên trong, tại sao người này sẽ biểu diễn nhiều hơn người kia? Có phải là do nó tự quay lên bộ đệm bên trong của chính nó (mà sẽ dần dần mở rộng khi cần thiết)? Ngoài ra, tôi rất vui khi có người khác thấy sử dụng mô hình xem để hiển thị e-mail; một nhà phát triển khác nghĩ rằng tôi đã làm quá mức, nhưng nó dễ thao tác và dễ thao tác hơn một chuỗi bạn phải thoát mọi thứ.
Allen Clark Copeland Jr

4

Đây là một lời giải thích tuyệt vời của Dino Esposito:

Sự khác biệt giữa hai phương pháp có thể trông nhỏ và vô hại, nhưng nó có thể cắn vào bạn nếu bạn không biết cách xử lý. Sự khác biệt chính giữa hai phương pháp là:

  • Partial trả về một chuỗi được mã hóa HTML
  • RenderPartiallà một phương thức void ghi trực tiếp vào luồng đầu ra phản hồi.

Cách sử dụng của hai phương pháp hơi khác nhau:

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

Sự lựa chọn sử dụng phụ thuộc vào yêu cầu của bạn. Nếu bạn cần thao tác thêm chuỗi được chèn trong luồng phản hồi, bạn nên sử dụng Partial; mặt khác đi với RenderPartial - chỉ vì nó đi thẳng vào luồng - nhanh hơn một chút so với Partial.

Cuối cùng, các trường hợp sử dụng cho các chế độ xem một phần rơi vào một trong hai phe. Đầu tiên là khi bạn tạo chế độ xem bằng cách kết hợp các phần đánh dấu độc lập khác nhau, như bên dưới.

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

Trong trường hợp này, quyết định của bạn trong việc lựa chọn giữa RenderPartialhoặc Partialkhông thay đổi hiệu ứng cuối cùng. Tuy nhiên, vì RenderPartialnhanh hơn một chút, bạn có thể thích sử dụng nó.


4
-1 Khi sao chép từ một nguồn khác, ít nhất là cung cấp tín dụng. Đây là một bản sao từ ngữ trắng trợn từ Pro ASP.NET MVC 3 Framework (hoặc ít nhất là một phiên bản mới hơn).
Robotron
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.