為ASP.NET MVC RC分離Controllers-Views項目後添加“腳手架”功能(一)(已添加MVC2.0及MVC3.0更新)

來源:互聯網
上載者:User

     連續忙了好幾個月,好久沒有寫東西了,最近稍微有點空,閒置時候回到了對ASP.NET MVC RC(以下簡稱MVC RC)的研究上來。MVC RC的“腳手架(Scaffold)”功能可以說為MVC RC的開發如虎添翼,不過應用到真實的開發環境中似乎存在一些遺憾的地方:很多時候我們並不希望把Models、Views和Controllers放在同一個項目裡面,而是把它們分離到不同的項目,然後由一個項目(比如Views)統一引用其他所有的項目程式集。但是這樣做了以後,Controllers項目中腳手架的功能就“消失了”。

在Web(MVC RC)項目中,我們可以這樣在Web項目中使用腳手架建立View頁面:

或者建立Controller檔案:

 

甚至可以在Controller檔案中自動建立或者查看對應Action的View頁面:

不過這一切經曆了Views和Controllers的“生死離別”之後,就再也無法在Controllers中使用了(原因會在下文中說明)。下面我們來做一個測試。

首先我們先把M、V、C三層分離,比如這樣:

 

需要注意的是當這樣做的時候,在Controllers項目中需要引用以下這三個核心的程式集:

System.Web.Abstractions.dll

System.Web.Mvc.dll

System.Web.Routing.dll

以及一些在預設的Controller.cs檔案中被引用到的命名空間,如:

System.Web

System.Configuration

以下是分離M-V-C(M之所以也要分離出去是因為C需要引用M,而C不能引用V)之後,啟動並執行預設介面,說明這樣的分離是成功的:

 

OK,到此為止MVC工作正常,只不過……無法在MyMvc.Controllers中使用MVC的腳手架:

分析一下原因:我們在把Controller分離出來的時候是建了“類庫(Class Library)”,一個普通的類庫當然無法使用MVC(Web)的腳手架,於是我開啟了MyMvc.Web的專案檔MyMvc.Web.csproj,用記事本開啟這個檔案(本質上是一個XML檔案),發現了一個和其他項目與眾不同的地方:

<ProjectTypeGuids>{603c0e0b-db56-11dc-be95-000d561079b0};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>

這個節點中用分號分割了3段看似Guid的代碼,分別是:

{603c0e0b-db56-11dc-be95-000d561079b0}

{349c5851-65df-11da-9384-00065b846f21}

{fae04ec0-301f-11d3-bf4b-00c04f79efbc}

立刻對比了一下MyMvc.Controllers下面的MyMvc.Controllers. csproj,發現沒有這個節點。喜出望外!於是馬上將這個節點複製到MyMvc.Controllers. csproj對應的地方,重新附加元件目以後,發現MyMvc.Controllers的腳手架功能回來了!

不過通過這樣簡單的添加還是發現了一些小小的瑕疵:細觀MyMvc.Controller的項目表徵圖類型,怎麼和Web的時一樣的()?不爽。

看來這樣的直接複製是把整個MVC Web Application下面的類型都一起複製過來了,為了避免日後不必要的麻煩,還是需要讓Controllers變回“類庫”,於是打起了那三個Guid的注意,經過兩次兩兩搭配後({fae04ec0-301f-11d3-bf4b-00c04f79efbc}一定要保留)發現,只要刪除中間的{349c5851-65df-11da-9384-00065b846f21}之後,MyMvc.Controllers項目又回到了“類庫”的狀態:

於是猜測{fae04ec0-301f-11d3-bf4b-00c04f79efbc}對應了Web Application的項目類型,而{603c0e0b-db56-11dc-be95-000d561079b0}對應了MVC RC的模板。

    注意:{603c0e0b-db56-11dc-be95-000d561079b0}對應了MVC RC(v1.0)的項目代碼,

    如果您使用的是MVC 2.0(包括Preview版本在內),對應的編碼為:{F85E285D-A4E0-4152-9332-AB1D724D3325}

    如果您使用的是MVC 3.0(包括Beta和RC版本在內),對應的編碼為:{E53F8FEA-EAE0-44A6-8774-FFD645390401}


 

通過以上這些操作,分離了M-V-C結構,並且在Controllers中“完整”保留了MVC RC的腳手架的功能。

上面的“完整”之所以要突出一下,是因為這種保留實在是太“完整”了,以至於在Controller中自動添加View頁面會添加到Controller項目中,而不是我們所希望的MyMvc.View項目中(查看對應View頁面也存在相同的問題)。這倒是個大問題,如果這個問題不解決,那麼“腳手架”反而成了“絆腳石”,這個問題如何解決呢?

請看下一篇《ASP.NET MVC RC分離C-V項目後添加“腳手架”功能(二)》

(本文的執行個體也在《ASP.NET MVC RC分離C-V項目後添加“腳手架”功能(二)》中提供下載。)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.