MVC原始碼分析 View續之Razor

2022-02-13 10:55:55 字數 1743 閱讀 6497

過完年, 大家都忙碌起來了, 我也不例外. 不過並不是忙碌於去面試找工作, 而是忙碌於現在手上的工作. 閒話不多說了, 進入今天的主題.

一、index頁面在**

很奇怪, 在目錄bin下面的dll檔案中, 都沒有看見過檢視的具體內容, 那麼他們都去**了呢?

首先在index頁面中, 加入一句話: @this.gettype().assembly.location

當程式執行起來之後, 就可以在頁面上看到執行的目錄. 

我的目錄是這個:

後面我標黃的這一段, 是隨機數, 不用去管它. 拿到他直接反編譯, 來看一下效果: 

[dynamic(new

bool )]

public

class _page_views_home_index_cshtml : webviewpage

//properties

protected}}

從這裡看, 頁面上的那些普通的標籤語句都通過 this.writeliteral() 方法, 解析成字串了. 而@model.name也解析出來了.

這裡注意到, 是將model轉成dynamic變數的. 那麼, 我在view這裡能不能傳乙個dynamic的值呢? 這個在後面會給出demo.

這裡的 _page_views_home_index_cshtml 類, 就是間接繼承自 webpagerenderingbase 類.

二、razor的基本用法

在mvc中, 在前台頁面, 可以借助razor像後台那樣程式設計. 然後通過 @變數 來輸出. 如:

@if (true)

括號裡面, 可以直接寫html是因為編譯器能識別標籤, 知道該怎麼去解析.

那麼如果我在

這兩種方式都是可以的, 就看個人習慣吧. 在使用的時候, vs縮排的讓人看著難受. 就像下面這樣:

兩種方式各有優缺點. 中間可以放很多內容. @:遇到多行時, 每一行都要加.

三、model傳值

在view(model)這裡可以傳遞後台的變數, 那麼這個model是存放在**的呢?

public

tmodel model

}

看這裡, 是存放在viewdata裡面的. 那麼也就是說, 我可以在後台通過 viewdata.model的方式來替換view(model)的方式來傳值. 事實上也是可以的.

那麼一般型別的值, 肯定都是可以傳遞的. 上面也說到, 能不能傳遞dynamic的值呢?

答案是不可以直接傳遞的, 也就是說我不能這麼傳遞: return view(dynamic), 那能不能傳遞匿名型別呢:return view(new ) ?

答案也是不可以直接傳遞. 

那麼有沒有辦法來傳遞這些值呢? 當然可以, 不然我也不會這麼問了. 

demo1:

public

actionresult index()

index頁面還是上面的那個. 看一下結果:

這裡我一遍序列化與反序列化, 就可以了. 這裡的model1當然也可以是匿名型別. 

不過這種方式並不推薦使用吧, 也挺麻煩的, 多了一道序列化與反序列化.

目錄已同步

MVC原始碼分析 路由匹配

這裡呼叫了自己 urlroutingmodule 的 postresolverequestcache 方法.在註冊路由的時候,ignore方式註冊的,會返回stoproutinghandler 按照順序,看上面我標紅的接個方法.1.getroutedata 方法 接著看,這裡呼叫了 route 類的...

SpringMVC之原始碼分析 View(一)

通過上幾章的介紹知道了viewresolver的作用,即viewresolver就是把handler返回的邏輯檢視名稱解析為檢視view物件。進而通過view物件的檢視渲染把最終的結果展現給使用者。view檢視渲染的原理,簡單說就是把模型資料填充到檢視模板,最終交由servlet的response進...

WebScarab關鍵原始碼分析(3)(續)

接上篇。接下來是兩個if,如果接收到的是401或者407返回碼 其含義分別為需驗證和 伺服器需驗證 則重新調整驗證資訊,並在下乙個while裡繼續請求內容。再乙個是判斷如果request使用的是head方法,則setnobody 因為head方法是不可能有內容部分的,呼叫setnobody後未讀取的...