3-8.ASP.NET Core MVC 入門教學 - 基本運作流程與主版型設定

ASP.NET Core MVC 入門教學

MVC的運作流程前面有大概介紹過了,如下面的圖

那這一節是要來講ASP.NET Core MVC這個架構本身運作的流程,在下一章正式進入前先了解一下基本的情況

首先路由(網址)的第一個部份,決定進哪一個Controller,例如/home/Index,就會進到HomeController.cs

再來路由第二個部分,決定進該Controller哪一個方法,例如/home/Index,就會進到Index()

最後再看return 什麼,如果是View()

會先去_ViewStart.cshtml,這裡面有預設套用一個主版型,等等再講是什麼

@{
    Layout = "_Layout";
}

對應的就是Shared\_Layout.cshtml

接著就要找到Views資料夾下,對應的.cshtml回應,至於怎麼對應,之前有提過了,這邊就不提了

最後再到剛剛上面的_Layout.cshtml,那這是一個主版型頁面,打開來看中間有一段

<div class="container">
    <main role="main" class="pb-3">
        @RenderBody()
    </main>
</div>

@RenderBody()會用上面View/Home/Index.cshtml的內容取代過來

所以再View下對應Controller的頁面預設都是子版型,但可以事後設定要對應到哪個主版型或不要有主版型

所以_Layout.cshtml算是給使用者看之前最後一個執行的地方,因此在Index.cshtml設定的@ViewData["Title"]的值

最後才能在_Layout.cshtml裡的<title>@ViewData["Title"] - WebApplication1</title>顯示出來

反之,_Layout.cshtml設定ViewData在Index.cshtml是拿不到的,因為執行上有先後,這點很重要

再者Controller是最先進去的,所以在Controller設定的ViewData,之後的cshtml都拿的到值

所以知道執行的順序是相當重要的一件事


那我們再來試試換一下主版型怎麼換,先建立一個_PayLayout.cshtml,我們想要去PayController的都使用這個主版型

所以我們可以改一下_ViewStart.cshtml裡的設定

@{
    var controller = ViewContext.RouteData.Values["controller"].ToString();

    if (controller == "Pay")
    {
        Layout = "_PayLayout";
    }
    else
    {
        Layout = "_Layout";
    }
}

這裡面寫的是,如果Controller是Pay的話,主版型就是_PayLayout.cshtml,其他的就是_Layout.cshtml,應該不難理解

所以進入Pay頁面就會是,套我們Pay的主版型

除了上面可以用程式的方式設定主版型,我們也可以使用規則的方式設定,例如我們再該View/Pay資料夾下,建立一個_ViewStart.cshtml,裡面如下

@{
    Layout = "_PayLayout";
}

雖然外層的_ViewStart.cshtml設定的是Layout = "_Layout";

但內層的_ViewStart.cshtml會比外層的更晚執行,所以內層的_ViewStart.cshtml設定會蓋過外層_ViewStart.cshtml的設定

因此這樣設定下來結果也是一樣,要選擇哪個方式,就看你喜歡用哪種方式設定即可

那還有一個地方其實也可以做設定,就是Index.cshtml本身裡面也可以設定Layout

那Index.cshtml又是比上面的_ViewStart.cshtml更晚執行,所以設定又會蓋過去,那我們這次設定不要主版型看看

@{
    Layout = null;
}

<a href="~/pay/ATM">使用ATM完成付款</a>
<br />
<a href="~/pay/LinePay">使用Line Pay完成付款。</a>

存檔後看看結果如下,就沒看到外框的主版型了

所以可以利用執行的先後,跟以上三個地方,自由的去搭配目前的版型設定方式,所以這設定方式算是非常的靈活

以上就是ASP.NET Core MVC架構運作的基本流程




Copyright © 凱哥寫程式 2022 | Powered by TalllKai ❤