ASP.NET MVC 系列3 - Html.RenderPartial與Html.RenderAction的差別

基本上RenderPartial()與RenderAction()這兩個方法非常相似,都是用來將UserControl(.ascx)嵌入到網頁上,並且可以讓網頁相同功能的區塊重覆使用,不需要在每個頁面重新寫程式碼,不過RenderPartial是直接將ascx檔的程式碼嵌入到aspx網頁上,並不會執行對應的Action程式碼,例如我們有一個產品的List頁面:

基本上RenderPartial()與RenderAction()這兩個方法非常相似,都是用來將UserControl(.ascx)嵌入到網頁上,並且可以讓網頁相同功能的區塊重覆使用,不需要在每個頁面重新寫程式碼,不過RenderPartial是直接將ascx檔的程式碼嵌入到aspx網頁上,並不會執行對應的Action程式碼,例如我們有一個產品的List頁面:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<IEnumerable<I3.Core.Model.ProductModel>>" %>

...
<table>
    <tr>
        <th></th>
        <th>編s號M1</th>
        <th>產£品~名W稱U</th>
        <th>版c本D?</th>
    </tr>

    <% foreach (var item in Model) { %>    
        <tr>
            <td>
                <%= Html.ActionLink("編s輯e", "EditProduct", new { id=item.ProductId  }) %> |
                <%= Html.ActionLink("詳MO細O", "ProductDetail", new {  id=item.ProductId })%>
            </td>
            <td>
                <%= Html.Encode(item.ProductId) %>
            </td>
            <td>
                <%= Html.Encode(item.Name) %>
            </td>
            <td>
                <%=  Html.Encode(item.Version) %>
            </td>
        </tr>

    <% } %>

</table>

若有許多頁面都需要用到此產品清單的列表,可以抽出來變成UserControl(例如ProductList.ascx),方便我們以後重覆利用,不過現在問題來了,那要使用Html.RenderPartial還是Html.RenderAction的方法?這時候會建議使用Html.RenderPartial,因為對於產品清單來說,我們只是用來呈現IEnumerable集合內的ProductModel資料,並不需要去執行ProductList.ascx的Action方法,所以就可以在網頁上使用下面的寫法來嵌入此UserControl:

<% Html.RenderPartial("Product", Model.Products); %>
//或是指定UserControl的路徑
<% Html.RenderPartial("~/Views/Product/ProductList.ascx", Model.Products); %>

至於Html.RenderAction則是會去執行Controller裡的Action,不過RenderAction有提供強行別的方式來呼叫Action,例如下面種寫法都是相同的:

<% Html.RenderAction("ProductList", "Product"); %>
//使用強行別的方式來呼叫Action
<% Html.RenderAction<I3.Controllers.ProductController>(x => x.ProductList()); %>

如果在網頁上使用RenderAction的方式來嵌入UserControl,這時候會先去執行ProductController的ProductList方法,再根據回傳的ActionResult來決定要呈現哪個ascx檔,當然也可以在Html.RenderAction傳入IEnumerable的集合物件 結論: Html.RenderPartial適合用在重覆使用的UserControl,必且只需要透過Model來呈現內容,或是對於廣告的UserControl也適合使用。 Html.RenderAction則會先去呼叫Controller的Action方法,如果此UserControl是需要透過資料庫取得資料來呈現(透過Action來讀取資料庫),此時會比較適合使用此方式。