Html.Partial vs Html.RenderPartial & Html.Action vs Html.RenderAction


Câu trả lời:


1237

Html.Partialtrả về một chuỗi. Html.RenderPartialgọi Writenội bộ và trả lại void.

Cách sử dụng cơ bản là:

// Razor syntax
@Html.Partial("ViewName")
@{ Html.RenderPartial("ViewName");  }

// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>

Trong đoạn trích trên, cả hai cuộc gọi sẽ mang lại kết quả như nhau.

Trong khi người ta có thể lưu trữ đầu ra của Html.Partialmột biến hoặc trả về nó từ một phương thức, thì người ta không thể làm điều này với Html.RenderPartial.

Kết quả sẽ được ghi vào Responseluồng trong quá trình thực hiện / đánh giá.

Điều này cũng áp dụng cho Html.ActionHtml.RenderAction.


71
Bạn có biết tại sao bạn sẽ sử dụng cái này hơn cái kia không?
Jason

156
hiệu suất-khôn ngoan tốt hơn là sử dụng RenderPartial, như đã trả lời ở đây: stackoverflow.com/questions/2729815/ mẹo
Vlad Iliescu

13
Cảm ơn bit về việc lưu trữ kết quả vào một biến. Đây là lý do để sử dụng Một phần hoặc Hành động so với đối tác Kết xuất.
David Kassa

8
Html.Partial()được tạo ra để có một cú pháp trôi chảy hơn với Dao cạo. Như @Vlad đã nói, Html.RenderPartial()hiệu quả hơn.
Tsahi Asher

2
@Tsahi giải thích lý do tại sao nó được sử dụng trong mẫu dự án MVC cho _LoginPartial. Cảm ơn.
chỉnh

86

Hãy nghĩ về @ Html.Partial như mã HTML được sao chép vào trang mẹ. Hãy nghĩ về @ Html.RenderPartial như một điều khiển người dùng .ascx được tích hợp vào trang mẹ. Một điều khiển người dùng .ascx có nhiều chi phí hơn.

'@ Html.Partial' trả về một chuỗi được mã hóa html được xây dựng nội tuyến với cha mẹ. Nó truy cập mô hình của cha mẹ.

'@ Html.RenderPartial' trả về tương đương với kiểm soát người dùng .ascx. Nó nhận được bản sao riêng của ViewDataDipedia của trang và các thay đổi được thực hiện đối với ViewData của RenderPartial không ảnh hưởng đến ViewData của cha mẹ.

Sử dụng sự phản ánh, chúng tôi tìm thấy:

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
Bạn đang nói rằng Html.Partial có hiệu suất tốt hơn Html.RenderPartial?
numaroth

15
Có và không, Html.Partial được hiển thị nội tuyến và ít tốn tài nguyên hơn nhưng tốn nhiều thời gian hơn. Html.RenderPartial được hiển thị riêng biệt và do đó nhanh hơn, nhưng tốn nhiều tài nguyên hơn. Nếu bạn có lưu lượng truy cập lớn, hãy ưu tiên Html.Partial để giảm mức sử dụng tài nguyên. Nếu bạn có những thay đổi không thường xuyên về lưu lượng truy cập, hãy ưu tiên Html.RenderPartial.
Brett Jones

4
Theo tôi, đó là cách khác: RenderPartial chắc chắn có hiệu suất tốt hơn khi nó ghi trực tiếp vào luồng đầu ra. Một phần bên trong gọi cùng một phương thức, nhưng ghi vào StringWriter, được trả về dưới dạng MvcHtmlString và cuối cùng được ghi vào luồng đầu ra. Do đó, nó phân bổ nhiều bộ nhớ hơn.
slfan

2
@BrettJones Ý của bạn là "thâm dụng tài nguyên" nghĩa là gì? Chỉ vì Partialkết xuất vào bộ đệm không có nghĩa là nó được hiển thị không đồng bộ - hoàn toàn ngược lại - tôi không thể thấy cách bạn có thể tuyên bố RenderPartiallà "tốn nhiều tài nguyên hơn".
Đại

57

Đây là những gì tôi đã tìm thấy:

Sử dụng RenderAction khi bạn không có mô hình để gửi đến chế độ xem và có rất nhiều html để mang lại mà không cần phải lưu trữ trong một biến.

Sử dụng Hành động khi bạn không có mô hình để gửi đến chế độ xem và có một chút văn bản để đưa trở lại cần được lưu trữ trong một biến.

Sử dụng RenderPartial khi bạn có một mô hình để gửi đến chế độ xem và sẽ có rất nhiều html không cần phải được lưu trữ trong một biến.

Sử dụng một phần khi bạn có một mô hình để gửi đến chế độ xem và sẽ có một ít văn bản cần được lưu trữ trong một biến.

RenderActionRenderPartial nhanh hơn.


2
Trả lời (Tại sao?) Là câu trả lời tốt nhất vì vậy đây là điều tốt nhất cho tôi.
YEH

55

Sự khác biệt là lần đầu tiên trả về một đầu ra MvcHtmlStringnhưng thứ hai ( Render..) thẳng đến phản hồi.


MvcHtmlString cũng sẽ không được thêm vào phản hồi chứ?
Shad

21

Theo tôi @Html.RenderPartial()đã thực hiện nhanh hơn so với @Html.Partial()do Html.RenderPartial cung cấp phản hồi nhanh cho Đầu ra.

Bởi vì khi tôi sử dụng @Html.Partial(), trang web của tôi mất nhiều thời gian hơn so với @Html.RenderPartial()


21

@Html.Partial@Html.RenderPartialđược sử dụng khi mô hình Chế độ xem một phần của bạn là sự tương ứng của mô hình mẹ, chúng tôi không cần tạo bất kỳ phương thức hành động nào để gọi phương thức này.

@Html.Action@Html.RenderActionđược sử dụng khi mô hình chế độ xem một phần của bạn độc lập với mô hình mẹ, về cơ bản nó được sử dụng khi bạn muốn hiển thị bất kỳ nội dung loại tiện ích nào trên trang. Bạn phải tạo một phương thức hành động trả về kết quả xem một phần trong khi gọi phương thức từ chế độ xem.


3
Câu trả lời hay, bởi vì bạn cũng giải thích khi nào nên sử dụng Partial over Action
raklos

15

Thêm về câu hỏi:

"Khi Html.RenderPartial () được gọi chỉ bằng tên của chế độ xem một phần, ASP.NET MVC sẽ chuyển sang chế độ xem một phần cho cùng các đối tượng từ điển Model và ViewData được sử dụng bởi mẫu chế độ xem cuộc gọi."

Ner NerdDinner trực tiếp từ ASP.NET ASP.NET Professional 1.0


9

Kiểu trả về Html.RenderActionvoidcó nghĩa là nó trực tiếp kết xuất các phản hồi trong Chế độ xem trong đó kiểu trả về Html.ActionMvcHtmlStringBạn có thể xem chế độ hiển thị của nó trong bộ điều khiển và sửa đổi nó bằng cách sử dụng phương thức sau

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

Điều này sẽ trả về chuỗi Html của View.

Điều này cũng được áp dụng cho Html.PartialHtml.RenderPartial


Làm thế nào tôi có thể làm điều này với Html.RenderPartial?
xatz

1
chúng tôi không thể sử dụng Html.RenderPartial vì loại trả về của nó là void
Namrata Jain

9

Partial hoặc RenderPartial: Không cần tạo phương thức hành động. sử dụng khi dữ liệu được hiển thị trên chế độ xem một phần đã có trong mô hình của trang hiện tại.

Action hoặc RenderAction: Yêu cầu phương thức hành động con. sử dụng khi dữ liệu để hiển thị trên khung nhìn có mô hình độc lập.


8

Sự khác biệt:

  1. Kiểu trả về RenderPartialvoid, nơi Partialtrả vềMvcHtmlString

  2. Cú pháp để gọi Partial()RenderPartial()phương thức trong chế độ xem Dao cạo

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

  3. Cú pháp để gọi Partial()RenderPartial()phương thức trong dạng xem webform

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

Sau đây là 2 câu hỏi phỏng vấn phổ biến liên quan đến Partial()RenderPartial() Khi nào bạn sẽ sử dụng Partial()hơn RenderPartial()và ngược lại?

Sự khác biệt chính là RenderPartial()trả về void và đầu ra sẽ được ghi trực tiếp vào luồng đầu ra, khi Partial()phương thức trả về MvcHtmlString, có thể được gán cho một biến và thao tác với nó nếu được yêu cầu. Vì vậy, khi có nhu cầu gán đầu ra cho một biến để thao tác với nó, sau đó sử dụng Partial (), khác sử dụng RenderPartial ().

Cái nào tốt hơn cho hiệu suất?

Từ góc độ hiệu suất, kết xuất trực tiếp đến luồng đầu ra là tốt hơn. RenderPartial()thực hiện chính xác điều tương tự và tốt hơn cho hiệu suất hơn Partial().


5

Html.Partial: trở lại MvcHtmlStringvà chậm

Html.RenderPartial: trực tiếp kết xuất / ghi trên luồng đầu ra và trả về voidvà nó rất nhanh so vớiHtml.Partial


3

Đối với "một phần" tôi luôn sử dụng nó như sau:

Nếu có thứ gì đó bạn cần đưa vào một trang mà bạn cần phải đi qua bộ điều khiển (giống như bạn thực hiện với một cuộc gọi Ajax) thì hãy sử dụng "Html.RenderPartial".

Nếu bạn có 'tĩnh' bao gồm không được liên kết với bộ điều khiển mỗi lần và chỉ trong thư mục 'chia sẻ', hãy sử dụng "HTML.partial"


2

@Html.Partialtrả về chế độ xem trong chuỗi được mã hóa HTML và sử dụng cùng một TextWriterđối tượng xem . @Html.RenderPartialphương pháp này trở lại void. @Html.RenderPartialnhanh hơn@Html.Partial

Cú pháp cho PartialView:

 [HttpGet] 
 public ActionResult AnyActionMethod
 {
     return PartialView();
 }
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.