之前在MVC1.0的時候,提供了Html.RenderPartial的方法,讓我們可以將共同的網頁元素設計成「元件」
的方式使用;不過在產生Model的時候,必須把所有的資料都先準備好,然後提供給Html.RenderPartial。
例如:一般都會先準備一個ViewModel,提供給View使用。從Controller那邊接收產生的DinnerFormViewModel
之後,把Model的資料傳遞給名為「DinnerForm」的Partial。
01 |
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage< NerdDinner.Controllers.DinnerFormViewModel >" MasterPageFile="~/Views/Shared/Site.Master" %> |
03 |
< asp:Content ID = "Title" ContentPlaceHolderID = "TitleContent" runat = "server" > |
07 |
< asp:Content ID = "Create" ContentPlaceHolderID = "MainContent" runat = "server" > |
09 |
< h2 >Host a Dinner</ h2 > |
11 |
<% Html.RenderPartial("DinnerForm"); %> |
而在MVC 2.0中,額外提供了Html.RenderAction的方法;這個方法和Partial有點不太一樣,他是直接重新執
行一次Controller → Model → View的順序,然後把產生的頁面帶回到原來的View中再回傳。
所以Html.RenderAction中傳遞的參數是執行的Controller和Action名稱。
03 |
< a href = "/" >ASP.NET MVC MUSIC STORE</ a > |
07 |
< li class = "first" >< a href = "/" id = "current" >Home</ a ></ li > |
08 |
< li >< a href = "/Store/" >Store</ a ></ li > |
10 |
<% Html.RenderAction("CartSummary", "ShoppingCart"); %> |
12 |
< li >< a href = "/StoreManager/" >Admin</ a ></ li > |
若是想讓建立的Action只能讓RenderAction呼叫,可以加上ChildActionOnly屬性,讓他無法被直接呼叫。
05 |
public ActionResult GenreMenu() |
07 |
var genres = storeDB.Genres.ToList(); |
以下是執行的比較圖:
Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的。
Html.RenderPartial是直接将用户控件嵌入到界面上:
<%Html.RenderPartial("LogOnUserControl");%>
或
<%Html.RenderPartial("~/Areas/Comm/Views/Shared/LogOnUserControl.ascx");%>
注意:用第一种方法时,用户控件必须放在调用者同一目录下,也可以放在View/Shared中。
Html.RenderAction则通过Controller中的Action来调用用户控件
Controller:----用户控件所在Controller
public ActionResult UserControl()
{
return PartialView();
}
View:----调用用户控件的View
<%Html.RenderAction("UserControl","Controller");%>
基本上RenderPartial()與RenderAction()這兩個方法非常相似,都是用來將UserControl(.ascx)嵌入到網頁上,並且可以讓網頁相同功能的區塊重覆使用,不需要在每個頁面重新寫程式碼,不過RenderPartial是直接將ascx檔的程式碼嵌入到aspx網頁上,並不會執行對應的Action程式碼,例如我們有一個產品的List頁面:
01 |
<%@ Page Language= "C#" Inherits= "System.Web.Mvc.ViewPage<IEnumerable<I3.Core.Model.ProductModel>>" %> |
12 |
<% foreach (var item in Model) { %> |
15 |
<%= Html.ActionLink( "編s輯e" , "EditProduct" , new { id=item.ProductId }) %> | |
16 |
<%= Html.ActionLink( "詳MO細O" , "ProductDetail" , new { id=item.ProductId })%> |
19 |
<%= Html.Encode(item.ProductId) %> |
22 |
<%= Html.Encode(item.Name) %> |
25 |
<%= Html.Encode(item.Version) %> |
若有許多頁面都需要用到此產品清單的列表,可以抽出來變成UserControl(例如ProductList.ascx),方便我們以後重覆利用,不過現在問題來了,那要使用Html.RenderPartial還是Html.RenderAction的方法?這時候會建議使用Html.RenderPartial,因為對於產品清單來說,我們只是用來呈現IEnumerable集合內的ProductModel資料,並不需要去執行ProductList.ascx的Action方法,所以就可以在網頁上使用下面的寫法來嵌入此UserControl:
1 |
<% Html.RenderPartial( "Product" , Model.Products); %> |
3 |
<% Html.RenderPartial( "~/Views/Product/ProductList.ascx" , Model.Products); %> |
至於Html.RenderAction則是會去執行Controller裡的Action,不過RenderAction有提供強行別的方式來呼叫Action,例如下面種寫法都是相同的:
1 |
<% Html.RenderAction( "ProductList" , "Product" ); %> |
3 |
<% 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來讀取資料庫),此時會比較適合使用此方式。
Apple/苹果 iPhone 4S 手机 iphone4s 16g 大陆行货 原封正品
盛宇家纺 全棉蕾丝七件套 提花婚庆床品床裙式套件 永在爱中