ASP.NET MVC中的檢視窗產生執行個體分析_實用技巧

來源:互聯網
上載者:User

本文執行個體分析了ASP.NET MVC中的檢視窗產生過程。分享給大家供大家參考。具體如下:

在 ASP.NET MVC 中,我們將前端的呈現劃分為三個獨立的部分來實現,Controller 用來控制使用者的操作,View 用來控制呈現的內容,Model 用來表示處理的資料。

從控制器到視圖

通常,在 Controller 中,我們定義多個 Action ,每個 Action 的傳回型別一般是 ActionResult,在 Action 處理的最後,我們返回對於視圖的調用。

複製代碼 代碼如下:
public ActionResult Index()
{
    return this.View();
}

預設情況下,將會調用與 Action 同名的視圖,比如,在上面的 Action 中,將會使用名為 Index 的視圖。
 
如果我們傳遞了一個字串參數,那麼,這個字串就回被視為視圖的名稱,例如,我們希望使用名為 IndexView 的視圖進行呈現,那麼,可以如下完成。
複製代碼 代碼如下:
public ActionResult Index()
{
    return this.View("IndexView");
}

布局與視圖

MVC 會直接去找我們的視圖嗎?不會!
 
從 Action 返回之後,首先,MVC 會在 Views 檔案夾下查看是否存在一個名為 _ViewStart.cshtml 的特殊檔案,如果存在的話,就回執行這個檔案。
 
預設情況下,這個檔案的內容如下所示:

複製代碼 代碼如下:
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

也就是說,它設定了我們的預設布局使用那一個檔案檔案。
 
布局等價於我們在 WebForm 中所使用的主版頁面。
 
如果沒有這個檔案,預設沒有使用布局。
 
如果有了這個檔案,而我們在頁面中不想使用這個布局怎麼辦呢?很簡單,在頁面中設定 Layout = null 來覆蓋掉它。
複製代碼 代碼如下:
@{
    Layout = null;
}

布局中的分區

在布局頁面中,預設就回存在一個特殊的指令 @RenderBody(),這是說,你在內容頁面中呈現的內容,將會在這裡進行輸出。這就是在使用布局之後,你會發現你的視圖中已經沒有了 <html> 標記的原因。

複製代碼 代碼如下:
<body>
    @RenderBody()
</body>

假如說,我們希望在布局中的多個位置進行輸出,比如,樣式表通常在 <head> 標記中,而現代的指令碼則會出現在頁面的最後,頁面的內容當然出現在頁面的主體中了。這樣的話,我們在內容頁面的實際內容,將會需要在布局的不同部分進行呈現,而不是在同一個位置進行呈現了。
 
解決的辦法就是分區,實際上,類似於 WebForm 中的 ContentPlaceHolder ,定義一個命名的地區。
 
比如,下面我們定義了一個名為 scripts 的命名地區,第二個參數表示這個地區是可選的地區,在內容頁面中可以不用提供內容。
複製代碼 代碼如下:
<body>
    @RenderBody()
 
    @RenderSection("scripts", required: false)
</body>

而在我們的內容視圖中,預設所有的內容都是填充到布局頁面中的 RenderBody 部分。
 
如果不是的話,就可以在內容頁面中,通過 @section 地區名稱{ } 的方式來定義準備輸出到對應地區中的內容了。
複製代碼 代碼如下:
@section scripts{
    <script type="text/javascript">
        var i = 0;
    </script>
}

分部視圖

如果我們的頁面比較複雜,在同一個視圖中定義輸出的內容會導致頁面非常複雜,通過將頁面劃分為多個比較獨立的組成部分,可以將一個複雜的頁面拆分為多個子部分來呈現。比如頁面的標題部分,頁面的菜單,頁面的腳註部分等等。在 WebForm 中,解決這個問題的技術稱為使用者控制項,在 MVC 中由兩個技術來解決:分部視圖和子Action。
 
先看分部視圖,分部視圖不依賴於 Action ,只能嵌入到其他獨立視圖中使用,你可以直接在視圖檔案夾中建立分部視圖。
 
在使用分部視圖的頁面中,使用 RenderPartial 方法調用分部視圖。

複製代碼 代碼如下:
Html.RenderPartial("ProductSummary");

分部視圖與主視圖共用所有的資料,比如模型,ViewData,ViewBag 等等,這些資料可以直接在分部視圖中使用。
 
如果希望分部視圖使用不同的模型對象,簡化分部視圖中的資料複雜度,也可以直接傳遞一個模型對象過去。
複製代碼 代碼如下:
Html.RenderPartial("ProductSummary", p);

這裡的第二個參數,將會在分部視圖中當在模型對象來使用。
 
需要注意的是 RenderPartial 方法的傳回型別是 void,它會將輸出的內容直接輸出到回應的輸出資料流中。所以在使用上面語句的時候,不能直接嵌入到頁面中,需要放在一個 @ { } 語句中,如下所示。
複製代碼 代碼如下:
@{
  Html.RenderPartial("ProductSummary", p);
}

如果你不喜歡這樣的文法,而希望直接嵌入到頁面中,也可以使用 Html.Partial 方法來呈現,區別是這個方法返回呈現的 Html 片段,而不是直接輸出到輸出資料流中。
複製代碼 代碼如下:
@Html.Partial("ProductSummary", p)

子 Action 問題

由於分布視圖沒有處理能力,只能繼承首頁面的資料進行呈現,如果需要有處理能力,怎麼辦呢?在 WebForm 中,我們可以使用 Server.Execute  來嵌入其它處理常式的輸出內容,在 MVC 中,我們使用子 Action 來處理。
 
子 Action 就是使用者不能直接存取,只能在其他的 Action 中訪問的 Action 方法,它與普通的 Action 一樣,有 Action 方法,還有這個 Action 對應的視圖。
 
我們使用特性 ChildActionOnly 來說明這是一個子 Action。

複製代碼 代碼如下:
[ChildActionOnly]
public string Menu()
{
    return "Hello, from NavController";
}

如果使用者直接請求這個子 Action ,那麼,系統會返回一個錯誤資訊。
 
操作“menu”只能由子請求訪問。

在其它視圖中,可以使用 RenderAction 來訪問子 Action,類似於 RenderPartial 方法,這個方法直接將內容輸出到輸出資料流中,由於它們的傳回型別都是 void ,所以需要使用 @{} 來使用。

複製代碼 代碼如下:
@{ Html.RenderAction("Menu", "Nav"); }

同樣,使用 Action 則可以直接返回一個 Html 片段,就不用使用一個 @{ } 了。
複製代碼 代碼如下:
<!--  Action -->
@Html.Action("Menu", "Nav")

希望本文所述對大家的asp.net程式設計有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.