基本上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
<% 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