之前在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" %> |
02 |
|
03 |
< asp:Content ID = "Title" ContentPlaceHolderID = "TitleContent" runat = "server" > |
04 |
Host a Dinner |
05 |
</ asp:Content > |
06 |
|
07 |
< asp:Content ID = "Create" ContentPlaceHolderID = "MainContent" runat = "server" > |
08 |
|
09 |
< h2 >Host a Dinner</ h2 > |
10 |
|
11 |
<% Html.RenderPartial("DinnerForm"); %> |
12 |
|
13 |
</ asp:Content > |
而在MVC 2.0中,額外提供了Html.RenderAction的方法;這個方法和Partial有點不太一樣,他是直接重新執
行一次Controller → Model → View的順序,然後把產生的頁面帶回到原來的View中再回傳。
所以Html.RenderAction中傳遞的參數是執行的Controller和Action名稱。
01 |
< div id = "header" > |
02 |
< h1 > |
03 |
< a href = "/" >ASP.NET MVC MUSIC STORE</ a > |
04 |
</ h1 > |
05 |
|
06 |
< ul id = "navlist" > |
07 |
< li class = "first" >< a href = "/" id = "current" >Home</ a ></ li > |
08 |
< li >< a href = "/Store/" >Store</ a ></ li > |
09 |
< li > |
10 |
<% Html.RenderAction("CartSummary", "ShoppingCart"); %> |
11 |
</ li > |
12 |
< li >< a href = "/StoreManager/" >Admin</ a ></ li > |
13 |
</ ul > |
14 |
</ div > |
若是想讓建立的Action只能讓RenderAction呼叫,可以加上ChildActionOnly屬性,讓他無法被直接呼叫。
01 |
// |
02 |
// GET: /Store/GenreMenu |
03 |
|
04 |
[ChildActionOnly] |
05 |
public ActionResult GenreMenu() |
06 |
{ |
07 |
var genres = storeDB.Genres.ToList(); |
08 |
|
09 |
return View(genres); |
10 |
} |
以下是執行的比較圖: