日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
詳解ASP.NETMVC3新的Layout布局系統(tǒng)

I:回憶MVC2當(dāng)中MasterPage那些事

創(chuàng)新互聯(lián)公司為客戶(hù)提供專(zhuān)業(yè)的網(wǎng)站制作、做網(wǎng)站、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開(kāi)發(fā). 服務(wù)項(xiàng)目涵蓋了網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站程序開(kāi)發(fā)、WEB系統(tǒng)開(kāi)發(fā)、微信二次開(kāi)發(fā)、移動(dòng)網(wǎng)站建設(shè)等網(wǎng)站方面業(yè)務(wù)。

大家先看下面的代碼:

 
 
 
 
  1.  
  2.  
  3. <%@ Master Language="C#"   
  4.     Inherits="System.Web.Mvc.ViewMasterPage" %> 
  5. Master head  
  6.  
  7. Master1...  
  8.  
  9. Master2...  
  10.  
  11. Master3...  
  12.  
  13.  
  14.  
  15.  
  16.  
  17. <%@ Page Language="C#"   
  18.     MasterPageFile="~/Views/Shared/Site.Master"   
  19.     Inherits="System.Web.Mvc.ViewPage" %> 
  20.  
  21. MainContent...  
  22.  
  23.  
  24.  
  25. OtherContent...  
  26.  
  27.  
  28.  
  29. AnyContent...  
  30.  
  31.  
  32.  
  33.  
  34. Master head  
  35. MainContent...  
  36. Master1...  
  37. OtherContent...  
  38. Master2...  
  39. AnyContent...  
  40. Master3...  
  41.  

我們可以看到在Master中ContentPlaceHolder服務(wù)端控件起到了一個(gè)占位符的作用.***輸出的,其實(shí)是在View當(dāng)中的Content服務(wù)端控件內(nèi)的內(nèi)容,接下來(lái)開(kāi)始介紹Layout.

II:ASP.NET MVC3 新的Layout布局系統(tǒng)

在MVC3當(dāng)中我們可以利用新的Layout布局系統(tǒng)來(lái)代替掉原來(lái)在MVC2當(dāng)中使用的MasterPage(當(dāng)然在MVC3當(dāng)中,如果你是繼續(xù)使用ASPX視圖引擎的話,那么還是可以用回原來(lái)的MasterPage,然后~~~~然后~你會(huì)和runat=”server”保持著從.NET 1.x到.NET 4.0以來(lái)從沒(méi)有間斷過(guò)的合作關(guān)系,可謂緣分呀!).

我們?cè)赩S2010 MVC3項(xiàng)目中創(chuàng)建Item時(shí),從創(chuàng)建向?qū)е锌梢钥吹揭韵滦略龅膸讉€(gè)Item

下面進(jìn)行逐一介紹:

Layout頁(yè):

該家伙其實(shí)就相當(dāng)于原來(lái)的Master文件.為站點(diǎn)的統(tǒng)一主題界面和減少大部分冗余的Html,head,body標(biāo)記曾作出過(guò)很大的貢獻(xiàn).可謂是功不可莫啊!MasterPage他的誕生是在.NET 2.0版本!在服役到.NET4.0版本后出現(xiàn)了一個(gè)新成員[Layout]去向他挑戰(zhàn).MasterPage能否經(jīng)得起新成員的挑戰(zhàn)呢?這個(gè)還是得留各位觀眾做詳細(xì)對(duì)比吧!

Partial頁(yè):

相當(dāng)于原來(lái)的UserControl.它可以為你減輕不少需要重復(fù)勞動(dòng)的時(shí)間!

View頁(yè):

就是View啦.創(chuàng)建它時(shí).一般都是在不需要使用Layout/MasterPage的時(shí)候.

View Page with Layout:

等同于原來(lái)的View Content Page.它的功能只是為了實(shí)現(xiàn)原來(lái)在Layout/MasterPage下所定義的占位符.當(dāng)然在原來(lái)的MasterPage中如果你沒(méi)有實(shí)現(xiàn)原先定義的占位符,那么在最終合并輸出的時(shí)候MasterPage占位符那里就會(huì)輸出空.

以上這4個(gè)新成員都是可以利用新的Razor視圖引擎進(jìn)行工作.如果你還沒(méi)了解Razor那么可以參考我的另外一編文章

1.Layout頁(yè)基礎(chǔ):

如果你有使用MasterPage的經(jīng)驗(yàn),你將會(huì)記得如下的幾個(gè)東西

A:<%@ Master %>

B:<%@ Page %>

C:

D:

但是在Layout中,以上的這些東西將會(huì)消失.(作者不排除有WebPages和WebForms兼容工作的可能性)

取而代之的新功能是:

A.Layout屬性:等同于原來(lái)的MasterPageFile屬性.

B.@RenderBody()方法:直接渲染整個(gè)View到占位符處,而不需要原來(lái)所使用的.

C.@RenderPage()方法:渲染指定的頁(yè)面到占位符處.

D.@RenderSection方法:聲明一個(gè)占位符,和原來(lái)的功能類(lèi)似.

E.@section標(biāo)記:對(duì)@RenderSection方法聲明的占位符進(jìn)行實(shí)現(xiàn),和原來(lái)的功能類(lèi)似.

1.1.@RenderBody()方法的使用

首先在~/Views/Shared/下創(chuàng)建一個(gè)名為_(kāi)MyLayout.cshtml的LayoutPage文件,并將默認(rèn)的內(nèi)容替換為如下:

 
 
 
 
  1.  
  2.  
  3.  
  4.     @ViewBag.Title 
  5.  
  6.  
  7.     
     
  8.         開(kāi)始渲染Body 
  9.         @RenderBody()  
  10.         渲染Body結(jié)束 
  11.     
 
  •  
  •  
  • 然后打開(kāi)在~/Views/Home/Index.cshtml文件并替換為如下的內(nèi)容:

     
     
     
     
    1. @{  
    2.     ViewBag.Title = "首頁(yè)";  
    3. }  
    4.  
    5.  
    6.     這里就是渲染Body啦.~~不需要寫(xiě)神馬<asp:Content />,其實(shí)因?yàn)镽enderBody()不在有歧義.  
     

    ***輸出截圖為:

    這個(gè)與之前MasterPage的代碼量相比之下減少了許多,而更為簡(jiǎn)潔明了.

    ***別忘記把~/Views/_ViewStart.cshtml中的Layout屬性改為:

    Layout = "~/Views/Shared/_MyLayout.cshtml";喔.

    在此,你或許會(huì)有疑問(wèn)了.在_Layout中定義的RenderBody()是Render那個(gè)頁(yè)啊?

    答:其實(shí)***Render頁(yè)的歸屬就是Render你所訪問(wèn)的那個(gè)頁(yè),比如你訪問(wèn)/Home/Index.那么Render就是Home控制器下的Index.cshtml這個(gè)文件, 如果訪問(wèn)的是/Ohter/SomePage時(shí),那么Render的是Ohter控制器下的SomePage這個(gè).cshtml!

    在這里可能有的朋友沒(méi)有接觸過(guò)MVC.在此補(bǔ)個(gè)基礎(chǔ),在默認(rèn)的路由設(shè)置選項(xiàng)下:

     
     
     
     
    1. public static void RegisterRoutes(RouteCollection routes)  
    2. {  
    3.     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");  
    4.  
    5.     routes.MapRoute(  
    6.         "Default", // Route name  
    7.         "{controller}/{action}/{id}", // URL with parameters  
    8.         new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    9. // Parameter defaults  
    10.     );  
    11.  

    請(qǐng)求地址:http://localhost/Home/Index的工作流程為下圖(這里沒(méi)有考慮Layout):

    如果這個(gè)RenderBody滿(mǎn)足不了你的業(yè)務(wù)需求,請(qǐng)放心,在此介紹另外一個(gè)Render方式RenderPage().它可以讓你指定要Render的頁(yè).

    1.2.@RenderPage()方法的使用

    在~/Views/Home/文件夾下新建立一個(gè)ViewPage1.cshtml文件,將內(nèi)容改為如下:

     
     
     
     
    1.  
    2.     這里是~/Views/Home/ViewPage1.cshtml,老規(guī)矩:還是不用寫(xiě)<asp:Content /> 
     

    并在原來(lái)的_MyLayout.cshtml文件中增加幾行代碼變成下面的這個(gè)樣子:

     
     
     
     
    1.  
    2.  
    3.  
    4.  
    5.     @ViewBag.Title 
    6.  
    7.  
    8.     
       
    9.         開(kāi)始渲染Body 
    10.         @RenderBody()  
    11.         渲染Body結(jié)束 
    12.          
    13.         開(kāi)始渲染其他頁(yè) 
    14.         @RenderPage("~/Views/Home/ViewPage1.cshtml")  
    15.         渲染其他頁(yè)結(jié)束 
    16.           
    17.     
     
  •  
  •  
  • 我們來(lái)看最終的輸出效果:

    在這里記住:@RenderBody()只能在_Layout.cshtml中使用一次,而@RenderPage()則可以使用多次!

    好了在這里如果還有不明白的朋友們.我下面上個(gè)圖說(shuō)明Render的工作原理

    如果想要了解在Layout中如何使用類(lèi)似于原來(lái)MasterPage中的功能請(qǐng)繼續(xù)往下看.

    III:在Layout布局系統(tǒng)中實(shí)現(xiàn)類(lèi)似于原來(lái)MasterPage功能的實(shí)現(xiàn)方式

    好,寫(xiě)到這里開(kāi)始介紹上一章節(jié)中沒(méi)有介紹完的兩個(gè)東西:@RenderSection方法和@section標(biāo)記

    1.@RenderSection()方法等價(jià)于,用途為在Layout中聲明一個(gè)占位符.

    操作:在原來(lái)的_MyLayout.cshtml文件中更改內(nèi)容為如下:

     
     
     
     
    1. @{  
    2.     //some code  
    3. }  
    4.  
    5.  
    6.  
    7.  
    8.     @ViewBag.Title 
    9.  
    10.  
    11.     
       
    12.         開(kāi)始渲染Body 
    13.         @RenderBody()  
    14.         渲染Body結(jié)束 
    15.          
    16.         開(kāi)始渲染其他頁(yè) 
    17.         @RenderPage("~/Views/Home/ViewPage1.cshtml")  
    18.         渲染其他頁(yè)結(jié)束 
    19.          
    20.         HOHO,開(kāi)始學(xué)習(xí)Section了 
    21.         開(kāi)始渲染Section 
    22.         聲明方式1(推薦):SectionA: 
    23.         @RenderSection("SectionA", false)  
    24.         ------- 
    25.           
    26.         聲明方式2:SectionB: 
    27.         @{  
    28.             if (IsSectionDefined("SectionB"))  
    29.             {  
    30.                 @RenderSection("SectionB")  
    31.             }  
    32.         }  
    33.         ------- 
    34.         渲染Sction結(jié)束 
    35.     
     
  •  
  •  
  • 在~/Views/Home/Index.cshtml中更改為如下內(nèi)容:

     
     
     
     
    1. @{  
    2.     ViewBag.Title = "首頁(yè)";     
    3.     //  
    4.     // some code  
    5.     //  
    6. }  
    7. @section SectionA{  
    8.     
      這里是SectionA:也不需要寫(xiě)神馬runat="server"啊,有木有
       
    9. }  
    10. @section SectionB{  
    11.     
      這里是SectionB:也不需要寫(xiě)神馬<asp:Content />啊,有木有
       
    12. }  
    13.  
    14.     這里就是渲染Body啦.~~不需要寫(xiě)神馬<asp:Content />,其實(shí)因?yàn)镽enderBody()不在有歧義.  
     

    ***顯示的頁(yè)面效果:

    問(wèn):為什么為什么要推薦方式1呢?
    答:因?yàn)镽enderSection()方法有2個(gè)重載.

    如果使用***個(gè)只接受一個(gè)string類(lèi)型參數(shù)的重載的話.~如果你在具體的View中沒(méi)有利用@section來(lái)定義實(shí)現(xiàn)的話,運(yùn)行會(huì)報(bào)錯(cuò).所以需要配合另外一個(gè)方法IsSectionDefined()來(lái)使用,才能防止報(bào)錯(cuò).

    而使用第2個(gè)重載就可以利用第二個(gè)bool類(lèi)型的參數(shù)指明該Section是否為必須的.所以可以在使用該RenderSection方法的時(shí)候直接利用第二個(gè)重載,再把bool參數(shù)值設(shè)為false,即使你在具體的View中沒(méi)有聲明實(shí)現(xiàn)@section,運(yùn)行起來(lái)也一如既往地蛋定,不Show黃頁(yè).

    IV:關(guān)于前篇文章中有熱心的觀眾朋友們問(wèn)到如何在Layout(MasterPage)中讀取數(shù)據(jù)庫(kù)并初始化頁(yè)面的問(wèn)題的解答

    在這里只是做個(gè)一簡(jiǎn)單的示范,新建一個(gè)類(lèi)文件,替換如下:

     
     
     
     
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Web;  
    5. using System.Data;  
    6. using System.Data.SqlClient; //在這里就用ADO.NET方式吧.EF我接觸不久!  
    7.  
    8. namespace Mvc3Application1  
    9. {  
    10.     public class ReaderSQL_Date  
    11.     {  
    12.         private static readonly string _SQL_CONN_STR = "server=.\\mssqlserver,1433;uid=sa;pwd=yourpwd;database=student;";  
    13.  
    14.         public static IList GetAllStudent()  
    15.         {  
    16.             //這里僅僅是做演示,生產(chǎn)環(huán)境并不這樣寫(xiě)  
    17.             using (SqlConnection conn = new SqlConnection(_SQL_CONN_STR))  
    18.             {  
    19.                 SqlCommand cmd = conn.CreateCommand();  
    20.                 cmd.CommandType = CommandType.Text;  
    21.                 cmd.CommandText = "SELECT [Sno],[Sname],[Sage] FROM [dbo].[STUDENT]";  
    22.  
    23.                 IList result = new List();  
    24.                 conn.Open();  
    25.                 using (SqlDataReader sdr = cmd.ExecuteReader())  
    26.                 {  
    27.                     while (sdr.Read())  
    28.                     {  
    29.                         result.Add(new StudentEntity  
    30.                         {  
    31.                             S_No = sdr.GetInt32(0),  
    32.                             S_Name = sdr.GetString(1),  
    33.                             S_Age = sdr.GetInt32(2)  
    34.                         });  
    35.                     }  
    36.                 }  
    37.                 //SqlConnection.ClearPool(conn); //可選清理連接池.  
    38.  
    39.                 return result;  
    40.             }  
    41.         }  
    42.     }  
    43.  
    44.     public class StudentEntity  
    45.     {  
    46.         public int S_No { get; set; }  
    47.         public string S_Name { get; set; }  
    48.         public int S_Age { get; set; }  
    49.     }  

    _MyLayout.cshtml替換如下:

     
     
     
     
    1. @{  
    2.     IList studentEntities = Mvc3Application1.ReaderSQL_Date.GetAllStudent();  
    3. }  
    4.  
    5.  
    6.  
    7.  
    8.     @ViewBag.Title 
    9.  
    10.  
    11.     
       
    12.  
    13.         @{  
    14.              
    15.                 
    16.  
    17.                     
    18.  
    19.                     
    20.  
    21.                     
    22.  
    23.                 
    24.  
    25.                 @foreach (Mvc3Application1.StudentEntity item in studentEntities)  
    26.                 {  
    27.                     
    28.  
    29.                         
    30.  
    31.                         
    32.  
    33.                         
    34.  
    35.                     
    36.  
    37.                 }  
    38.             
    39. 學(xué)號(hào) 姓名 年齡
      @item.S_No @item.S_Name @item.S_Age
       
    40.         }  
    41.  
    42.         開(kāi)始渲染Body 
    43.         @RenderBody()  
    44.         渲染Body結(jié)束 
    45.          
    46.         開(kāi)始渲染其他頁(yè) 
    47.         @RenderPage("~/Views/Home/ViewPage1.cshtml")  
    48.         渲染其他頁(yè)結(jié)束 
    49.          
    50.         HOHO,開(kāi)始學(xué)習(xí)Section了 
    51.         開(kāi)始渲染Section 
    52.         聲明方式1(推薦):SectionA: 
    53.         @RenderSection("SectionA", false)  
    54.         ------- 
    55.           
    56.         聲明方式2:SectionB: 
    57.         @{  
    58.             if (IsSectionDefined("SectionB"))  
    59.             {  
    60.                 @RenderSection("SectionB")  
    61.             }  
    62.         }  
    63.         ------- 
    64.         渲染Sction結(jié)束 
    65.     
     
  •  
  •  
  • 最終顯示:

    原文鏈接:http://www.cnblogs.com/highend/archive/2011/04/18/asp_net_mvc3_layout.html

    【編輯推薦】

    1. 淺談ASP.NET MVC 3中如何使用Model
    2. 體驗(yàn)ASP.NET MVC 3中的Razor特性
    3. MVC架構(gòu)模式為什么這樣“紅”?
    4. 專(zhuān)訪微軟MVP衣明志:走進(jìn)ASP.NET MVC 2框架開(kāi)發(fā)
    5. ASP.NET MVC 3基礎(chǔ)教程之Web Pages

    本文標(biāo)題:詳解ASP.NETMVC3新的Layout布局系統(tǒng)
    網(wǎng)頁(yè)URL:http://www.dlmjj.cn/article/dhgjies.html