-
前言
掐指一算,3年沒寫博了,好懶的說。。。
眾所周知,MVC現在越來越火了,不懂MVC的程序猿都不好意思說自己是搞網站開發的。
雖然MVC與WebForm各有所長,但是基於種種原因,很多用WebForm開發的網站需要轉移到MVC上面來。但是,原有的系統上面有非常非常龐大的業務代碼和頁面代碼,在實際工作中,不可能將一個WebForm開發的網站一次性全部轉換到MVC框架中來,那么這個時候,就要用到本文說的:在WebForm中使用MVC。采用一個頁面一個頁面的方式,逐漸將整個網站全部轉移到MVC中。
-
為WebForm項目添加引用
要使用MVC,肯定要為項目添加MVC的引用,由於是我們自己操作,肯定不會像通過VS創建MVC項目那樣引用一大篇的dll。必須引入的有以下幾個:
System.Web.Abstractions;
System.Web.DynamicData;
System.Web.Mvc;
System.Web.Optimization;
System.Web.Razor;
System.Web.WebPages;
-
建立MVC項目結構
使用MVC最大的一個好處就是細分了網站層,所以MVC中約定俗成的幾個目錄一個都不能少。Controllers、Views、Models、Scripts、Content幾個文件是必須按照MVC項目結構搬移過來。
當然,Controllers和Models你可以自定義到其他dll中去,Scripts和Content你也可以使用自己的目錄結構存放。但是Views必須放在根目錄下,並且Views目錄中結構必須如下圖所示(Shared目錄和目錄中的文件不能少,_ViewStart、Web.config文件也不能少,至於Home目錄,是自己開發的,可以不必理會):
-
配置Web.config文件
原有WebForm的Web.config中的節點不要隨便動,將下面的config內容中各個節點添加到原有的Web.config文件中。
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> </sectionGroup> </configSections> <appSettings> <add key="webpages:Enabled" value="false" /> </appSettings> <system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Web.Mvc"/> <add namespace="System.Web.Mvc.Ajax"/> <add namespace="System.Web.Mvc.Html"/> <add namespace="System.Web.Routing"/> <add namespace="System.Linq"/> <add namespace="System.Collections.Generic"/> </namespaces> </pages> </system.web.webPages.razor> <system.web> <compilation debug="true" targetFramework="4.5"> <assemblies> <add assembly="System.Web.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </assemblies> </compilation> <httpRuntime targetFramework="4.5" /> <pages> <namespaces> <add namespace="System.Web.Mvc"/> <add namespace="System.Web.Mvc.Ajax"/> <add namespace="System.Web.Mvc.Html"/> <add namespace="System.Web.Routing"/> <add namespace="System.Linq"/> <add namespace="System.Collections.Generic"/> </namespaces> </pages> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration>
關鍵是configSections、appSettings、system.web.webPages.razor三個節點,如果有丟失,那么cshtml文件將在開發時無法識別razor語法(運行時能夠識別)。
system.web節點中的兩段引用如果缺失,MVC頁面將無法訪問。
system.webServer中的<modules runAllManagedModulesForAllRequests="true"/>節點如果丟失,MVC頁面將無法訪問。
-
注冊路由
好了,結構搭建完成,現在要為MVC的路由進行注冊了。
WebForm中有一個文件叫做全局應用程序類Global.asax,如果沒有,就添加一個。
在Golbal.asax的Application_Start事件中,添加以下代碼:
RouteCollection routes = RouteTable.Routes; //避免對 Web 資源文件(例如 WebResource.axd 或 ScriptResource.axd)的請求傳遞給控制器 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //避免aspx頁面的請求傳遞給控制器 routes.IgnoreRoute("{resource}.aspx/{*pathInfo}"); //路由注冊 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
怎么樣,這段代碼是不是很熟悉?不錯,它就是MVC項目中App_Start目錄下的RouteConfig.cs文件的RegisterRoutes方法代碼。
-
測試一下
來個gif動態圖。
OK,收工。