WebForm中使用MVC


 

  • 前言

掐指一算,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目錄,是自己開發的,可以不必理會):

image

  • 配置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方法代碼。

image

  • 測試一下

來個gif動態圖。

webmvc

OK,收工。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM