1.查找控制器的過程
1.1調(diào)用其他項目中的控制器
a.先到網(wǎng)站根目錄下的bin文件夾下,遍歷所有的程序集 b.找到以Controller結(jié)尾的類 c.再找出其中繼承了Controller的類 d.接著創(chuàng)建同名的對象,并調(diào)用Action方法 |
1.2當(dāng)調(diào)用同名控制器時
知道了控制器是怎么找到了,那如果bin中有兩個同名的控制器怎么辦,先看看問題
解決方式
a.在路由配置信息中,在遍歷控制器時,只到指定命名空間下查找 b.可以看到namespaces是一個數(shù)組,即可以指定多個命名空間,可以提高遍歷速度 |
2.找視圖的過程
2.1外部控制器,加載視圖
a.先到 請求網(wǎng)站根目錄下的 View文件夾 中找與控制器同名的視圖 b.再到 請求網(wǎng)站根目錄下的 View文件夾 中找共享文件夾中的的視圖 |
2.2知道了視圖加載,那么我們就在網(wǎng)站跟目錄下,添加一個視圖
2.3下面我們來改下,路由信息中的命名空間,其他都不變
結(jié)論:多個控制器共享同一個視圖,做到了控制器與視圖的分離,即業(yè)務(wù)與視圖分離
3.開始區(qū)域
3.1先來說說區(qū)域怎么用
在網(wǎng)站根目錄下,右擊添加區(qū)域,輸入?yún)^(qū)域名,如下我添加了兩個區(qū)域;同時也添加了兩個類庫,如下
3.2看看區(qū)域為我們做了什么
1.網(wǎng)站啟動的時候,最先會調(diào)用application_Start(),則在網(wǎng)站啟動的時候,就注冊了區(qū)域路由。 當(dāng)網(wǎng)站啟動的時候,首先去網(wǎng)站根目錄下的bin文件夾中,找繼承了AreaRegistration類的區(qū)域注冊類, 然后創(chuàng)建這些類的對象,并調(diào)用它的RegisterArea()方法,來完成區(qū)域路由注冊 2.然后在事件管道中,根據(jù)請求的url到靜態(tài)路由表中,查找匹配的路由 3.在第11和12事件間,調(diào)用沒vcHandler的PR()方法,在其中根據(jù) 匹配 的結(jié)果去查找相應(yīng)的控制器類 |
3.3開始執(zhí)行
因為路由表中注冊了區(qū)域路由,即User/{controller}/{action}/{id},那么在請求的時候,就要加上區(qū)域文件User。
因為控制器在類庫UserController中,在找程序集的時候,會根據(jù) 命名空間來找控制器類。
同時會調(diào)用Views/UserHome/Index.cshtml視圖,為了看到效果,我們在Area/User/View/UserHome下添加一個視圖。
由上面找控制器可知:
1.我們可以在區(qū)域注冊文件中,添加一個namespace,值為UserController的命名空間,或者
2.將區(qū)域注冊 文件的命名空間改成UserController的命名空間,
我選擇了第二種,為了方便,我直接把區(qū)域注冊文件拉到UserController類庫中,再直接把命名空間改掉
3.4為什么要用區(qū)域
我最開始,說建兩個區(qū)域,和兩個類庫,大家有沒有想到什么。沒錯,用區(qū)域的好處,就把控制器單獨的功能,獨立開來,而不是把所有的控制器擠在一塊,那會很擁擠,同時在P01MVCWeb項目中,只有視圖,我們最好把區(qū)域注冊文件,也放到與控制器同項目的地方
4.得出結(jié)論
0.瀏覽器發(fā)來請求:/User/UserHome/Index 1.網(wǎng)站啟動的時候,最先會調(diào)用Application_Start(),則在網(wǎng)站啟動的時候,就注冊了區(qū)域路由。 【當(dāng)網(wǎng)站啟動的時候,首先去網(wǎng)站根目錄下的bin文件夾中,找繼承了AreaRegistration類的區(qū)域注冊類, 然后創(chuàng)建這些類的對象,并調(diào)用它的RegisterArea()方法,來完成區(qū)域路由注冊】 2.然后在事件管道中,根據(jù)請求的url到靜態(tài)路由表中,查找匹配的路由:User/{controller}/{action}/{id} 3.在第11和12事件間,調(diào)用沒vcHandler的PR()方法,在其中根據(jù) 匹配 的結(jié)果去查找相應(yīng)的控制器類,即類UserHome.cs 3.1因為我們在注冊區(qū)域路由的時候,指定了查找的命名空間,然后找到 【不寫的話,默認是使用區(qū)域注冊類的命名空間】 4.找到控制器類后,就創(chuàng)建該類的對象,并調(diào)用它的Index方法 5.控制器指定調(diào)用的視圖,執(zhí)行View()方法返回的是 ViewResult對象 【Action方法,只是創(chuàng)建視圖對象,并沒有加載視圖】 5.1然后調(diào)用ViewResult對象的ExcuteResult()方法 5.2然后查找相應(yīng)的視圖引擎【本次使用的是Razor引擎】,并通過視圖引擎找到相應(yīng)的視圖 |
新聞熱點
疑難解答