ASP.NET MVC2 Areas地區新概念

來源:互聯網
上載者:User
為了方便大規模網站中的管理大量檔案,ASP.NET MVC 2.0版本中引入了一個新概念—區段(Area)。在本文中,我們將討論與區段概念相關的基本操作。 

  隨著對Web應用程式功能需求的日益增長,與特定Web應用程式相關聯的檔案的數量有可能會急劇增長。在Web表單應用程式中,網頁通常分為若干個子檔案夾,每個子檔案夾代表這些網頁集合中的一個邏輯分組。另一方面,Web表單項目模板有可能使用任意的檔案夾結構來進行檔案組織。

  ASP.NET MVC按照既定慣例進行管理。因此,對應的檔案夾結構比較嚴格,你甚至可以照搬照抄使用,所有網頁都被劃分為根資料夾Views下的一些子檔案夾,每一個子檔案夾與Controllers檔案夾中的每個控制器名稱相匹配。例如,“Organizations”控制器就在“Views”檔案夾下有一個對應的“Organizations”檔案夾,所有ASPX網頁描述了對應於Organizations控制器的視圖。圖1給出了一個這樣的可能的樣本檔案夾結構:

  圖1—樣本MVC工程結構

  雖然上述過程可以允許稍微的定製,但是由於約定慣例檔案夾結構還是保持比較嚴格的組織方式。最新版本的MVC 2.0中在上述約定中添加了一個區段(Area)的新概念。這樣一來,在嚴格的ASP.NET MVC架構和邏輯組件分離之間就出現了一種平衡機制。理解這一點最簡單的方式就是觀察一下一個樣本工程的檔案夾結構。下面給出的是與前面的圖1同一樣的項目,但是經過使用內聯區段技術進行了重新布局。

  圖2—使用內聯式區段

  內聯項目區段允許ASP.NET MVC項目在維持控制器、模型和視圖檔案夾結構的同時,還對邏輯組件進行相互的分離,但是核心項目實施與Organizations區段是分離開來的。應用程式的區段可以允許出現重複的控制器類命名、模型類名字、視圖命名等,但各個區段還可以共用“Shared”檔案夾下的資源。

  你可能看到,在上面圖1和圖2中給出的兩個檔案夾架構例子中,檔案夾架構略微改變了一下。圖1中只有一個organization控制器,現在有了一個organization區段,在串連中出現了另一個層級的階層。現在,針對/Organizations/Index的請求被路由到/Organizations/Management/Index之下。

  一、路由

  ASP.NET MVC中視圖之間使用的預設的路由機制都是按照慣例執行的。例如,在圖1中,到Manage行為的連結將會產生下列的行為連結聲明,這樣會產生一個重新導向到主專案中的Organizations控制器的超連結。

  清單1—將目標鎖定在Organizations控制器中的Manage視圖上

Html.ActionLink("Manage this Organization", "Manage",
new { controller = "Organizations", key = 1 })

 

  第一個參數指定連結文本,而最後三個參數依次指定要調用的行為方法、行為方法所在的控制器和路由參數,這些參數就像查詢字串一樣進行傳遞(除非在路由中指定參數)。

  區段概念的引入對上述情形進行了一些改變,因為我們需要能夠區分希望路由到的區段。要實現這一點是很簡單的,我們只需要把一個額外的區段對應的鍵/值對添加到路由參數列表中。為了路由到如清單2所示的新的內聯段中,我們可以使用下面的文法:

  清單2—將目標鎖定在Organizations區段上的Management控制器中的Manage視圖上

Html.ActionLink("Manage this Organization", "Manage", "Management",
new { area = "Organizations" key = 1 })

 

  一個區段目標指定了要導航到的正確區段。不使用這種辦法,連結將導航到主專案中的ManagementController控制器,但這個控制器是不存在的。在上面的代碼中,我們新增加了area = "Organizations",從而實現把所有請求正確路由到區段範圍內的控制器上。

 

但是,要實現這一目標還需要幾個步驟—需要使用一個稱為AreaRegistration的新的對象。我們需要針對區段使用一個定製的註冊過程,如清單3所示。  

       清單3—註冊一個區段的代碼舉例

 

public class OrganizationsAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Organizations";
        }
    }
    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Organizations_default",
            "Organizations/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

 

  這裡,RegisterArea是實現註冊的關鍵組件,通過把另一個路由添加到區段路由集合中實現。請注意,這裡的區段名Organizations是以寫入程式碼方式添加到URL中;因此,所有使用此區段名稱作為首碼的請求都被進行特別路由處理。  
  你可能感到疑惑:為什麼我們不能在主應用程式的路由定義中指定Organizations部分?實際上,如果我們將它加入到標準的路由表中,而不通過區段上下文,那麼,我們還是把所有檔案駐留到同一個項目中,從而失去了首先分離項目區段的好處(即區段失敗了作用)。

  二、多項目區段

  儘管不直接為ASP.NET MVC 2所支援,但是在測試版本的ASP.NET MVC中,仍然支援多項目區段,即通過區段把一個大項目分成多個子項目。一個單獨的ASP.NET MVC項目可以被看作是一個區段,其工作方式就像一個嵌入式區段一樣。這種方法非常類似於嵌入式工程區段,當然還要在MVC項目中進行一些額外的設定工作。

  上述額外的設定功能需要使用一種技術,即複製項目內容並在主專案中布署它們,主要是把外部項目區與主ASP.NET MVC項目進行合并。藉助於ASP.NET MVC未來程式集的一部分,架構會自動地通過一個MSBuild任務為你完成這項工作。有一個稱為Microsoft.Web.Mvc.Build.dll的程式集負責執行此過程。

  注意:上述功能不被微軟官方所支援。但是,如果你想嘗試利用此安裝程式的話,下面的資源將有助於你實現定製的項目構建任務:

     •  http://msdn.microsoft.com/en-us/library/ee307987%28VS.100%aspx
  •  http://dotnetslackers.com/articles/aspnet/a-first-look-at-asp-net-mvc-2.aspx

  至於微軟方面,到目前為止僅支援單個項目區段。

  三、我的看法

  “區段”概念的引入有助於實現內容的分離,但因為各種各樣的原因,我的建議是不要過度使用這一概念。首先,“區段”的引入的確增加了專案範圍內的檔案的數量。保持儘可能小的專案檔數目將有助於保持應用程式的可維護性。當然我不是反對使用區段技術,只是推薦在項目規模和實現內容邏輯分離之間要保持一個適度的平衡為最好。

  使用區段帶來的一個很好的特性是,你可以為視圖設定具有類似命名的控制器,從而使得整個網站感覺是一致的。例如,區段accounts,store和catalog可以使用一致的URL,通過給予每一個區段類似命名的控制器和行為來實現。例如,你的網站可以使用如下的組織方式:

 

/Accounts/Search/Index
/Store/Search/Index
/Catalog/Search/Index

 

 

  雖然一致性不是必需的,但是它可以協助使用者更容易地在你的網站中導航—通過使用類似的設定(假定每個視圖都提供類似的功能)。

  四、結論

  “區段”概念的引入有助於實現內容的分離,並能夠改變路由過程工作的方式。區段有自己的檔案夾結構並能夠實現把他們自己的控制器要求路由到對應的視圖。路由需要使用一個新的區段路由參數,以便路由到正確的區段上。

轉自: http://tech.it168.com/a2010/0901/1098/000001098030_1.shtml

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.