MVC Areas

来源:http://www.cnblogs.com/xuzhen1993/archive/2017/03/24/6612810.html
-Advertisement-
Play Games

ASP.NET MVC中,是依靠某些文件夾以及類的固定命名規則去組織model實體層,views視圖層和控制層的。如果是大規模的應用程式,經常會由不同功能的模塊組成,而每個功能模塊都由MVC中的三層所構成,因此,隨著應用程式規模的增大,如何組織這些不同功能模塊中的MVC三層的目錄結構,有時對開發者來 ...


ASP.NET MVC,是依靠某些文件夾以及類的固定命名規則去組織model實體層,views視圖層和控制層的。如果是大規模的應用程式,經常會由不同功能的模塊組成,而每個功能模塊都由MVC中的三層所構成,因此,隨著應用程式規模的增大,如何組織這些不同功能模塊中的MVC三層的目錄結構,有時對開發者來說顯得是種負擔。

  幸運的是,ASP.NET MVC允許開發者將應用劃分為區域”(Area)的概念,每個區域都是按照asp.net mvc的規定對文件目錄結構和類的命名規則進行命名。在本文中,將介紹如何在ASP.NET MVC應用中使用Area進行模塊管理。

  什麼是Areas?

  簡單來說,Areas是將ASP.NET MVC應用按照不同的功能模塊劃分,對每個功能模塊使用ASP.NET MVC規則的目錄結構和命名方法。考慮如下圖的場景:

 

  在上圖中可以看到,這個應用程式由三個功能模塊組成,分別為Blog,Help DeskShopping。如果不使用區域Areas的話,則必須將所有的控制層和視圖層文件都放在各自的目錄中去,顯然,不能在不同的功能模塊中的對控制器有相同的命名,比如不能在Blog模塊中命名HomeController,同時也對HelpDesk模塊命名HomeController。可以解決的方法是,在一個控制器中將所有的模塊中的action方法都放在一起,或者創建兩個控制器,以不同的方法命名(BlogHomeControllerHelpDeskHomeController).

  如果使用了areas進行模塊劃分,則每個功能模塊都會複製MVC的目錄結構。比如,每個模塊都會有自己的控制層,視圖層和實體層的目錄。因此,可以在Blog模塊中擁有HomeController類,在HelpDesk模塊中也可以同名的HomeController類。所以,實際上在上面的例子中,將會有4MVC的結構,一個是主程式的,三個分別是三個模塊(Blog, HelpDesk and Shopping)

  增加新的Area

  下麵我們來開始學習如何新增Area。首先使用vs.net 2010新建一個MVC應用。然後在方案解決器中,滑鼠右鍵點擊後在出現的菜單中選擇新增>Area,就會顯示如下圖的對話框:

 

  在其中輸入要增加的Area的名稱,比如HelpDesk。在輸入三個不同的Area後,項目呈現如下圖的結構:

 

  可以看清晰看到,整個應用是有一個叫Areas的目錄,其中下麵三個模塊都有各自的控制層,模型層和視圖層的目錄了。同樣,在應用的外層目錄中,依然有實體層和控制層和視圖層的目錄。

 

MVC框架中註冊Area

  除了建立好目錄結構外,還需要告訴ASP.NET MVC框架area已經建立好了,這個屬於註冊的步驟,幸運地在建立一個新的area時已經自動建立起來了。請註意在每一個area的目錄下,都會自動產生一個註冊的類文件(比如BlogAreaRegistration.cs, HelpDeskAreaRegistration.cs,)。每一個area的註冊類文件都是繼承自AreaRegistration這個基類,比如HelpDeskAreaRegistration的類文件代碼如下:

 

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

 

  可以看到,HelpDeskAreaRegistration類覆寫了AreaName屬性和RegisterArea方法。RegisterArea方法則在MVC中註冊了新的路由信息。

  在每一個area中都必須有一個象這樣的註冊類。但什麼時候去使用這些註冊的類呢?如果打開Global.asx這個文件,會發現在Application_Start事件中會發現如下代碼:

 

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); 
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}

 

  這裡讀者可以看到,調用了AreaRegistration類的靜態方法RegisterAllAreas()去註冊所有的are註冊文件,而RegisterAllAreas()方法會去逐一調用應用中所有areaRegisterArea()方法。

  接下來,在主程式及每個area中都增加HomeController,這樣,就會有四個以HomeController命名的控制類,如下所示:

 

public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}

 

  同樣,滑鼠右擊每個Index()方法,在彈出的菜單中新增加一個Index視圖,這樣總共有4index視圖頁面。運行應用,可以看到如下圖的效果,下圖是其中運行HelpDesk Area時的效果,請留意其中的URL

 

  Areas之間的調用

  ASP.NET MVC中,經常需要在控制層的不同方法之間進行互相調用。如果沒特別指定,則預設為同一個area中的action方法和控制器之間的調用。如果需要在不同的area之間進行互相調用,可以使用如下方法:

 

<%= Html.ActionLink("Main Area", "Index", "Home", new { area = "" }, null)%>
<br /><br />
<%= Html.ActionLink("Blog Area", "Index", "Home", new { area = "Blog" }, null)%>
<br /><br />
<%= Html.ActionLink("Help Desk Area", "Index", "Home", new { area = "HelpDesk" }, null)%>
<br /><br />
<%= Html.ActionLink("Shopping Area", "Index", "Home", new { area = "Shopping" }, null)%

 

  可以看到,上面使用了ActionLink()方法產生鏈接,註意其中的第4個參數,使用new {area=“Blog”}這樣形式的參數,指出調用的是哪一個areaaction方法。

  使用RedirectToAction

  同樣,我們經常要在某個area中的action方法去調用另外一個area方法中的action,這個時候要如何做呢?代碼如下:

 

  public ActionResult Index()

  {

  return RedirectToAction("Index", "Home", new { Area = "HelpDesk" });

  }

 

  這裡,使用了RedirectToAction方法去調用另外一個area中的action方法,同樣是使用了new {Area=“HelpDesk”}的方式,指定area的名稱即可,所以這裡調用了HelpDesk Area中的index()方法。

  小結

  在本文中,介紹了ASP.NET MVC中的Area的概念,Area模塊化的方式,能將複雜的應用劃分為各個模塊,併在每個模塊中都能按照MVC的架構劃分視圖,實體和控制層的目錄架構,這樣更有利於項目的架構組織,更清晰容易在各模塊之間進行對應的調用。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這個問題一開始覺得還是挺簡單的,網上也看到不少解決方案。 首先一個最簡單最直接的方案就是自定義一個名為FinalValue的依賴屬性。隨後重載OnThumbDragCompleted函數,在Thumb控制項完成拖動時改寫FinalValue。代碼如下 試著跑一下,似乎搞定了。等一下,左右鍵怎麼不起作用 ...
  • 原網頁 http://www.web-jia.com/view.php?a=10 今天在開發中遇到個bug 我在datatable中添加數據的時候報錯了我傳了大於int32的數字就出錯了 datatable中的用columns.add("test", SqlDbType.BigInt.GetType ...
  • using System.Data;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.IO;using System.Text; namespace DotNet.Utilities{ ...
  • using System; using System.Collections.Generic; using System.Text; using Microsoft.Office.Interop.Word; using System.Windows.Forms; using System.IO; u... ...
  • using System.Threading; using System; namespace ConsoleApplication4 { public class Program { static void Main(string[] args) { try { St... ...
  • (一)泛型概述 泛型不僅是C#編程語言的一部分,而且與程式集中的IL代碼緊密地集成。泛型不僅是C#語言的一種結構,而且是CLR定義的。有了泛型就可以創建獨立於被包含類型的類和方法了。 1、性能 泛型的一個主要優點就是性能。對值類型使用非泛型集合類,在把值類型轉化為引用類型,和把引用類型轉換為值類型時 ...
  • 1 var orders = from o in context.Orders 2 join a in context.Accounts on 3 // 使用匿名類型來構造一個複合的查詢表達式 4 new { Id = o.AccountId, City = o.ShipCity, State = ... ...
  • 1 ((IObjectContextAdapter)dbcontext).ObjectContext.CreateQuery<object>(esql, new ObjectParameter("name", value)) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...