本文實(shí)例分析了asp.net mvc中的視圖生成過(guò)程。分享給大家供大家參考。具體如下:
在 asp.net mvc 中,我們將前端的呈現(xiàn)劃分為三個(gè)獨(dú)立的部分來(lái)實(shí)現(xiàn),controller 用來(lái)控制用戶的操作,view 用來(lái)控制呈現(xiàn)的內(nèi)容,model 用來(lái)表示處理的數(shù)據(jù)。
從控制器到視圖
通常,在 controller 中,我們定義多個(gè) action ,每個(gè) action 的返回類型一般是 actionresult,在 action 處理的最后,我們返回對(duì)于視圖的調(diào)用。
復(fù)制代碼 代碼如下:public actionresult index()
{
return this.view();
}
默認(rèn)情況下,將會(huì)調(diào)用與 action 同名的視圖,比如,在上面的 action 中,將會(huì)使用名為 index 的視圖。
如果我們傳遞了一個(gè)字符串參數(shù),那么,這個(gè)字符串就回被視為視圖的名稱,例如,我們希望使用名為 indexview 的視圖進(jìn)行呈現(xiàn),那么,可以如下完成。
復(fù)制代碼 代碼如下:public actionresult index()
{
return this.view(indexview);
}
布局與視圖
mvc 會(huì)直接去找我們的視圖嗎?不會(huì)!
從 action 返回之后,首先,mvc 會(huì)在 views 文件夾下查看是否存在一個(gè)名為 _viewstart.cshtml 的特殊文件,如果存在的話,就回執(zhí)行這個(gè)文件。
默認(rèn)情況下,這個(gè)文件的內(nèi)容如下所示:
復(fù)制代碼 代碼如下:@{
layout = ~/views/shared/_layout.cshtml;
}
也就是說(shuō),它設(shè)置了我們的默認(rèn)布局使用那一個(gè)文件文件。
布局等價(jià)于我們?cè)?webform 中所使用的母版頁(yè)。
如果沒有這個(gè)文件,默認(rèn)沒有使用布局。
如果有了這個(gè)文件,而我們?cè)陧?yè)面中不想使用這個(gè)布局怎么辦呢?很簡(jiǎn)單,在頁(yè)面中設(shè)置 layout = null 來(lái)覆蓋掉它。
復(fù)制代碼 代碼如下:@{
layout = null;
}
布局中的分區(qū)
在布局頁(yè)面中,默認(rèn)就回存在一個(gè)特殊的指令 @renderbody(),這是說(shuō),你在內(nèi)容頁(yè)面中呈現(xiàn)的內(nèi)容,將會(huì)在這里進(jìn)行輸出。這就是在使用布局之后,你會(huì)發(fā)現(xiàn)你的視圖中已經(jīng)沒有了 <html> 標(biāo)記的原因。
復(fù)制代碼 代碼如下:<body>
@renderbody()
</body>
假如說(shuō),我們希望在布局中的多個(gè)位置進(jìn)行輸出,比如,樣式表通常在 <head> 標(biāo)記中,而現(xiàn)代的腳本則會(huì)出現(xiàn)在頁(yè)面的最后,頁(yè)面的內(nèi)容當(dāng)然出現(xiàn)在頁(yè)面的主體中了。這樣的話,我們?cè)趦?nèi)容頁(yè)面的實(shí)際內(nèi)容,將會(huì)需要在布局的不同部分進(jìn)行呈現(xiàn),而不是在同一個(gè)位置進(jìn)行呈現(xiàn)了。
解決的辦法就是分區(qū),實(shí)際上,類似于 webform 中的 contentplaceholder ,定義一個(gè)命名的區(qū)域。
比如,下面我們定義了一個(gè)名為 scripts 的命名區(qū)域,第二個(gè)參數(shù)表示這個(gè)區(qū)域是可選的區(qū)域,在內(nèi)容頁(yè)面中可以不用提供內(nèi)容。
復(fù)制代碼 代碼如下:<body>
@renderbody()
@rendersection(scripts, required: false)
</body>
而在我們的內(nèi)容視圖中,默認(rèn)所有的內(nèi)容都是填充到布局頁(yè)面中的 renderbody 部分。
如果不是的話,就可以在內(nèi)容頁(yè)面中,通過(guò) @section 區(qū)域名稱{ } 的方式來(lái)定義準(zhǔn)備輸出到對(duì)應(yīng)區(qū)域中的內(nèi)容了。
復(fù)制代碼 代碼如下:@section scripts{
<script type=text/javascript>
var i = 0;
</script>
}
分部視圖
如果我們的頁(yè)面比較復(fù)雜,在同一個(gè)視圖中定義輸出的內(nèi)容會(huì)導(dǎo)致頁(yè)面非常復(fù)雜,通過(guò)將頁(yè)面劃分為多個(gè)比較獨(dú)立的組成部分,可以將一個(gè)復(fù)雜的頁(yè)面拆分為多個(gè)子部分來(lái)呈現(xiàn)。比如頁(yè)面的標(biāo)題部分,頁(yè)面的菜單,頁(yè)面的腳注部分等等。在 webform 中,解決這個(gè)問(wèn)題的技術(shù)稱為用戶控件,在 mvc 中由兩個(gè)技術(shù)來(lái)解決:分部視圖和子action。
先看分部視圖,分部視圖不依賴于 action ,只能嵌入到其他獨(dú)立視圖中使用,你可以直接在視圖文件夾中創(chuàng)建分部視圖。
在使用分部視圖的頁(yè)面中,使用 renderpartial 方法調(diào)用分部視圖。
復(fù)制代碼 代碼如下:html.renderpartial(productsummary);
分部視圖與主視圖共享所有的數(shù)據(jù),比如模型,viewdata,viewbag 等等,這些數(shù)據(jù)可以直接在分部視圖中使用。
如果希望分部視圖使用不同的模型對(duì)象,簡(jiǎn)化分部視圖中的數(shù)據(jù)復(fù)雜度,也可以直接傳遞一個(gè)模型對(duì)象過(guò)去。
復(fù)制代碼 代碼如下:html.renderpartial(productsummary, p);
這里的第二個(gè)參數(shù),將會(huì)在分部視圖中當(dāng)在模型對(duì)象來(lái)使用。
需要注意的是 renderpartial 方法的返回類型是 void,它會(huì)將輸出的內(nèi)容直接輸出到回應(yīng)的輸出流中。所以在使用上面語(yǔ)句的時(shí)候,不能直接嵌入到頁(yè)面中,需要放在一個(gè) @ { } 語(yǔ)句中,如下所示。
復(fù)制代碼 代碼如下:@{
html.renderpartial(productsummary, p);
}
如果你不喜歡這樣的語(yǔ)法,而希望直接嵌入到頁(yè)面中,也可以使用 html.partial 方法來(lái)呈現(xiàn),區(qū)別是這個(gè)方法返回呈現(xiàn)的 html 片段,而不是直接輸出到輸出流中。
復(fù)制代碼 代碼如下:@html.partial(productsummary, p)
子 action 問(wèn)題
由于分布視圖沒有處理能力,只能繼承主頁(yè)面的數(shù)據(jù)進(jìn)行呈現(xiàn),如果需要有處理能力,怎么辦呢?在 webform 中,我們可以使用 server.execute 來(lái)嵌入其它處理程序的輸出內(nèi)容,在 mvc 中,我們使用子 action 來(lái)處理。
子 action 就是用戶不能直接訪問(wèn),只能在其他的 action 中訪問(wèn)的 action 方法,它與普通的 action 一樣,有 action 方法,還有這個(gè) action 對(duì)應(yīng)的視圖。
我們使用特性 childactiononly 來(lái)說(shuō)明這是一個(gè)子 action。
復(fù)制代碼 代碼如下:[childactiononly]
public string menu()
{
return hello, from navcontroller;
}
如果用戶直接請(qǐng)求這個(gè)子 action ,那么,系統(tǒng)會(huì)返回一個(gè)錯(cuò)誤信息。
操作“menu”只能由子請(qǐng)求訪問(wèn)。
在其它視圖中,可以使用 renderaction 來(lái)訪問(wèn)子 action,類似于 renderpartial 方法,這個(gè)方法直接將內(nèi)容輸出到輸出流中,由于它們的返回類型都是 void ,所以需要使用 @{} 來(lái)使用。
復(fù)制代碼 代碼如下:@{ html.renderaction(menu, nav); }
同樣,使用 action 則可以直接返回一個(gè) html 片段,就不用使用一個(gè) @{ } 了。
復(fù)制代碼 代碼如下:<!-- action -->
@html.action(menu, nav)
希望本文所述對(duì)大家的asp.net程序設(shè)計(jì)有所幫助。
更多信息請(qǐng)查看IT技術(shù)專欄