asp.net mvc area實現多級controller和多級view

来源:http://www.cnblogs.com/ives/archive/2017/11/15/mvc_area.html
-Advertisement-
Play Games

經常需要描述這樣的項目結構 ~:. //web根目錄├─.admin //管理員功能目錄│ └─index.html //管理員目錄頁面├─.user //用戶功能目錄│ └─index.html //用戶功能目錄└─index.html //首頁 在普通的mvc之下,我們需要將每個controll ...


經常需要描述這樣的項目結構

~:.        //web根目錄
├─.admin      //管理員功能目錄
│  └─index.html    //管理員目錄頁面
├─.user                  //用戶功能目錄
│  └─index.html      //用戶功能目錄
└─index.html          //首頁

在普通的mvc之下,我們需要將每個controller和view都寫在固定的頁面中,這樣所有的文件都堆砌在這兩個目錄中,

對於普通的小型項目,這樣或許是比較方便的解決方案,但需要將項目目錄進行細緻的劃分的時候預設的mvc目錄就

無法實現我們需要的功能了。

一般我們會使用兩種方式來實現

1.通過自定義路由+自定義視圖引擎

2.使用area來對每個目錄進行具體的管理

示例如下:

描述:系統包括三種主要用戶類型,學生、教師、管理員,對於每種用戶的相關功能代碼分類進行整體,便於集中管理也利於

區分其他功能避免文件較多產生歧義

1.通過自定義路由+自定義視圖引擎

首先定義路由規則,在項目目錄下的App_Start/RouteConfig.cs文件中進行配置

 1 public static void RegisterRoutes(RouteCollection routes)
 2         {
 3             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 4 
 5             //添加自定義的路由規則
 6             routes.MapRoute(
 7                 //根據約定,需要保證路由名的唯一性
 8                 name: "teacher",
 9                 //此處通過添加teacher部分來區分教師的功能頁面
10                 url: "teacher/{controller}/{action}/{id}",
11                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
12                 //此處由於多個路由規則都使用了名為Home的controller,所以需要
13                 //傳入名稱空間來保證控制器的唯一性
14                 namespaces:new string[] { "SCMS.Controllers.teacher" });
15             routes.MapRoute(
16                 name: "manager",
17                 url: "manager/{controller}/{action}/{id}",
18                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
19                 namespaces: new string[] { "SCMS.Controllers.manager" });
20             routes.MapRoute(
21                 name: "admin",
22                 url: "admin/{controller}/{action}/{id}",
23                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
24                 namespaces: new string[] { "SCMS.Controllers.admin" });
25             
26             //系統定義的路由規則
27             routes.MapRoute(
28                 name: "Default",
29                 url: "{controller}/{action}/{id}",
30                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
31                 namespaces: new string[] { "SCMS.Controllers" });
32         }            

重寫視圖引擎部分

構造如下的一個類,繼承RazorViewEngine類,並重寫ViewLocationFormats的內容

public class ViewEngine : RazorViewEngine
    {

        public ViewEngine()
        {
            ViewLocationFormats = new[]
            {
                "~/Views/{1}/{0}.cshtml",
                "~/Views/Shared/{0}.cshtml",
                "~/Views/admin/{1}/{0}.cshtml",
                "~/Views/teacher/{1}/{0}.cshtml",
                "~/Views/manager/{1}/{0}.cshtml"
            };
        }

    }

清除原有的視圖引擎並將重寫的視圖引擎傳入,文件位置為全局Global.asax文件

 protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            //註意此處
            ViewEngines.Engines.Clear();
            ViewEngines.Engines.Add(new ViewEngine());
        }

根據網上教程經過嘗試後發現能夠實現自定義目錄的目的,但是根據此處的view解析目錄,系統預設提供的

解析方式和自定義的解析方式只有一個能保證訪問成果,若有使用不當之處望周知。此處給出一個不算恰當

的解決方案,將直接存放在預設位置的首頁也獨立管理即可。然後去掉"~/Views/{1}/{0}.cshtml"項,加入

"~/Views/Home/{1}/{0}.cshtml"

至此,第一種方式已經結束

 2.使用area來對每個目錄進行具體的管理

通過第一種辦法雖能實現我們需要的功能,但是對於功能較多的項目來說對於每一個功能都需要單獨處理,

這樣需要重寫大量的路由規則和view匹配規則,也可能是對mvc的瞭解不夠所以沒發現更好的辦法,這裡

就可以使用area區域來對其目錄結構進行管理,如下

通過右鍵項目目錄新建區域建立區域框架,然後創建瞭如下的目錄結構

C:\USERS\IVES\DESKTOP\SCMS\SCMS\AREAS
├─admin
│  ├─Controllers
│  ├─Models
│  └─Views
│      ├─Home
│      └─Shared
├─manager
│  ├─Controllers
│  ├─Models
│  └─Views
│      └─Shared
└─teacher
    ├─Controllers
    ├─Models
    └─Views
        └─Shared

此處我們可以發現每個區域的目錄結構樹中均包含獨立的MVC的結構,我們只需要將對應的每一個目錄的內容放入對應的區域即可

具體內容見下圖

如圖,我們只需要將原來直接寫在項目路徑下的相關內容直接寫在此處對應area中即可,其他與原來的使用方式沒有任何差別

此處的第二種方式既直掛又簡單快捷,推薦使用

 

記錄下來,留待後查,同時方便他人。

聯繫我進行交流。[email protected]

2017.11.15

15:37


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

-Advertisement-
Play Games
更多相關文章
  • 詳情: 1. tar 創建一個新的tar文件 解壓tar文件 查看tar文件 2. grep 在文件中查找字元串(不區分大小寫) 輸出成功匹配的行,以及該行之後的三行 在一個文件夾中遞歸查詢包含指定字元串的文件 3. find 查找指定文件名的文件(不區分大小寫) 對找到的文件執行某個命令 查找ho ...
  • 1.基本命令 創建目錄pathA:mkdir pathA 進入目錄pathA:cd pathA 查看目錄內容:ls 查看目錄下文件的詳細信息:ls -l,也可以是:ll(l是小寫的L,別看錯了) 拷貝文件fileA到目錄pathA(同層目錄前提):cp fileA pathB 拷貝目錄pathA(包 ...
  • #!/bin/bash #按日切割nginx日誌並壓縮,加入crontab每天0:00切割 #作者:fafu_li #時間:2015.08.15 source /etc/profile #載入系統環境變數 source ~/.bash_profile #載入用戶環境變數 set -o nounset... ...
  • #!/bin/bash #全備方式,一般在從機上執行,適用於小中型mysql資料庫 #刪除15天以前備份 #作者:fafu_li #時間:2015.08.10 source /etc/profile #載入系統環境變數 source ~/.bash_profile #載入用戶環境變數 set -o ... ...
  • 今年電賽我們隊伍選擇的是B題,滾球控制系統。最後我們得到了省特和國一,也算是了結了我大一時的心愿吧。下麵對這次比賽進行一下總結,以後回憶起來的時候也有個念想。 滾球控制系統是一個多變數、非線性控制對象,是球桿系統的二維擴展。本系統以Arduino Due為核心控制板,通過攝像頭採集到球的位置信息,經 ...
  • 如何設置隔行變色。 如圖: 設置:只要設置如下屬性,就行了。 AlternatingRowsDefaultCellStyle 屬性獲取或設置應用於 DataGridView 的奇數行的預設單元格樣式。RowsDefaultCellStyle 屬性獲取或設置應用於 DataGridView 的行單元格... ...
  • 一、問題描述: 在測試EF併發處理時,涉及到StoreGeneratedPattern屬性的賦值問題,以及數據持久化失敗,看瞭如下2篇文章後,可以實現併發控制了, 針對“computed”類型的欄位:指的是創建和修改時都自動修改此屬性的值 不清楚的是採用ModelFirst方式,根據模型創建資料庫及... ...
  • 在第一篇的基礎上,本文主要講解基於EntityFramework 及SqlServer2012 實現基本的CRUD功能。 一、設計錄入界面 創建一個錄入Form,用來管理UserAccount數據。 1.在項目文件上右鍵,選擇Add->New Item.. 2.選擇Windows 窗體 模板,將名字... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...