1. 程式人生 > >MVC分部檢視的使用:Html.Partial/RenderPartial,Html.Action/RenderAction,RenderPage

MVC分部檢視的使用:Html.Partial/RenderPartial,Html.Action/RenderAction,RenderPage

ASP.NET MVC 裡的部分檢視,相當於 Web Form 裡的 User Control。我們的頁面往往會有許多重用的地方,可以進行封裝重用。
使用部分檢視有以下優點: 1. 可以簡寫程式碼。 2. 頁面程式碼更加清晰、更好維護。
在視圖裡有多種方法可以 載入部分檢視,包括: Partial() 、RenderPartial() 、 Action() 、RenderAction() 、 RenderPage() 方法

一、Partial與RenderPartial

1.Razor 語法: @Html.Partial() 與 @{Html.RenderPartial();} 
2.區別:Partial 可以直接輸出內容,它內部是 將 html 內容轉換為 string 字元(MVCHtmlString)(進行Html編碼),然後快取起來,最後在一次性輸出到頁面。顯然,這個轉換的過程,會降低效率,所以通常使用 RenderPartial 代替。 這兩者都只是抓取分部檢視頁面類容,不能執行分部檢視方法,所以用Partial或RenderPartial方法來顯示分部檢視不用建立對應的Action,因為不走Action.

3.例項:

普通呼叫分部檢視

主頁 Index.cshtml:

  1. @{  
  2.     Layout = null;  
  3. }  
  4. <!DOCTYPE html>  
  5. <html>  
  6. <head>  
  7.     <meta name="viewport" content="width=device-width" />  
  8.     <title>Index</title>  
  9. </head>  
  10. <body>  
  11.     <div>   
  12.         <h3>我是首頁</h3>  
  13.         <section>  
  14.             <h2>分部檢視</h2>  
  15.             @Html.Partial("~/Views/Templates/Partial1.cshtml")  
  16.         //@{Html.RenderPartial("~/Views/Templates/Partial1.cshtml");}  
  17.  </section> </div></body></html>  
  18. 分部檢視Partial1.cshtml:  
  19. <table border="1px solid" cellpadding="0" cellspacing="0">  
  20.     <tr>  
  21.         <th>姓名</th>  
  22.         <th>性別</th>  
  23.         <th>年齡</th>  
  24.         <th>電話</th>  
  25.     </tr>  
  26.     <tr>  
  27.         <td>longxi1</td>  
  28.         <td>男</td>  
  29.         <td>22</td>  
  30.         <td>13521187063</td>  
  31.     </tr>  
  32.     <tr>  
  33.         <td>longxi1</td>  
  34.         <td>男</td>  
  35.         <td>22</td>  
  36.         <td>13521187063</td>  
  37.     </tr>  
  38. </table>  
  39. 強型別分部檢視:  
  40. 主頁 Index.cshtml:  
  41. @using WebApplication1.Models  
  42. @{  
  43.     Layout = null;  
  44. }  
  45. @{   
  46.     List<Student> students = new List<Student>() {  
  47.         new Student("zhulongxi",22,"男","13521187063"),  
  48.         new Student("zhulongxi",22,"男","13521187063"),  
  49.         new Student("zhulongxi",22,"男","13521187063"),  
  50.         new Student("zhulongxi",22,"男","13521187063"),  
  51.         new Student("zhulongxi",22,"男","13521187063")  
  52.     };  
  53. }  
  54. <!DOCTYPE html>  
  55. <html>  
  56. <head>  
  57.     <meta name="viewport" content="width=device-width" />  
  58.     <title>Index</title>  
  59. </head>  
  60. <body>  
  61.     <div>   
  62.         <h3>我是首頁</h3>  
  63.         <section>  
  64.             <h4>分部檢視</h4>  
  65.             @Html.Partial("~/Views/Templates/Partial1.cshtml", students)//如果Partial1.cshtml與Index.cshtml在相同目錄,則可以直接寫成  
  66.         @Html.Partial("~/Views/Templates/Partial1.cshtml", students)  
  67.  </section> </div></body></html>  

分部檢視Partial1.cshtml:

  1. @using WebApplication1.Models;  
  2. @{   
  3.     var studentsList = Model as List<Student>;  
  4. }  
  5. <table border="1px solid" cellpadding="0" cellspacing="0">  
  6.     @foreach (Student student in studentsList)  
  7.     {  
  8.         <tr>  
  9.             <th>@student.Name</th>  
  10.             <th>@student.Gender</th>  
  11.             <th>@student.Age</th>  
  12.             <th>@student.Phone</th>  
  13.         </tr>  
  14.     }  
  15. </table>  
二、Action與RenderAction

1.Razor 語法:@Html.Action()與@{Html.RenderAction();}
2.區別:Action 也是直接輸出,和 Partial 一樣,也存在一個轉換的過程。不如 RenderAction 直接輸出到當前 HttpContext 的效率高。
除此之外,Action與Partial相比,Action訪問了控制器中的Action,執行了Action內部的業務。
3.例項:

Index.cshtml:

  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4.     <meta name="viewport" content="width=device-width" />  
  5.     <title>Index</title>  
  6. </head>  
  7. <body>  
  8.     <div>   
  9.         <h3>我是首頁</h3>  
  10.         <section>  
  11.             <h4>分部檢視</h4>  
  12.             @Html.Action("MyPartial", "Home",new { title="學生列表"})  
  13.         </section>  
  14.     </div>  
  15. </body>  
  16. </html>  

HomController:
  1. public class HomeController : Controller  
  2.     {  
  3.         // GET: Home  
  4.         public ActionResult Index()  
  5.         {  
  6.             return View();  
  7.         }  
  8.         public ActionResult MyPartial(string title)  
  9.         {  
  10.             List<Student> students = new List<Student>() {  
  11.             new Student("zhulongxi2",22,"男","13521187063"),  
  12.             new Student("zhulongxi2",22,"男","13521187063"),  
  13.             new Student("zhulongxi2",22,"男","13521187063"),  
  14.             new Student("zhulongxi2",22,"男","13521187063"),  
  15.             new Student("zhulongxi2",22,"男","13521187063")  
  16.              };  
  17.             ViewBag.Data = title;  
  18.             return PartialView("~/Views/Templates/Partial2.cshtml",students);  
  19.         }  
  20.     }  
Partial2.cshtml:
  1. @using WebApplication1.Models  
  2. @{   
  3.     var studentsList = Model as List<Student>;  
  4.     var data = ViewBag.Data;  
  5. }  
  6. @{Response.Write(data); }  
  7. <table border="1px solid" cellpadding="0" cellspacing="0">  
  8.     @foreach (Student student in studentsList)  
  9.     {  
  10.         <tr>  
  11.             <th>@student.Name</th>  
  12.             <th>@student.Gender</th>  
  13.             <th>@student.Age</th>  
  14.             <th>@student.Phone</th>  
  15.         </tr>  
  16.     }  
  17. </table>  

三、RenderPage

1.Razor語法:@RenderPage()
2.區別:也可以使用 RenderPage 來呈現部分,但它不能使用 原來檢視的 Model 和 ViewData ,只能通過引數來傳遞。而 RenderPartial、RenderAction 可以使用原來檢視的 Model 和 ViewData。@RenderPage也並沒有執行Action。
3.例項:
不傳引數情況:
Index.cshtml:
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4.     <meta name="viewport" content="width=device-width" />  
  5.     <title>Index</title>  
  6. </head>  
  7. <body>  
  8.     <div>   
  9.         <h3>我是首頁</h3>  
  10.         <section>  
  11.             <h4>分部檢視</h4>  
  12.            @RenderPage("~/Views/Templates/Partial1.cshtml")  
  13.         </section>  
  14.     </div>  
  15. </body>  
  16. </html>  
傳引數情況:
Index.cshtml:
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4.     <meta name="viewport" content="width=device-width" />  
  5.     <title>Index</title>  
  6. </head>  
  7. <body>  
  8.     <div>   
  9.         <h3>我是首頁</h3>  
  10.         <section>  
  11.             <h4>分部檢視</h4>  
  12.            @RenderPage("~/Views/Templates/Partial1.cshtml",new { param1="longxi",param2="男"})  
  13.         </section>  
  14.     </div>  
  15. </body>  
  16. </html>  
Partial1.cshtml:
  1. @{   
  2.     var param = string.Format("{0}-{1}", PageData["param1"], PageData["param2"]);  
  3. }  
  4. @Html.Raw(param)