無法參考 App_Code 資料夾下的 class

這幾天為了之前同事的問題進而聯想到的情境在做測試,大意就是希望在 web 啟動時紀錄時間讓開發人員可以得知 web 啟動至實際存取特定頁面的時間差

所以參考了 ASP.NET Global Variables Example - Dot Net Perls 在 App_Code 資料夾中加入一個 static class 與 property 要來驗證,只是過程有點出乎意料,來看看發生了什麼事吧

前置準備

  1. 建立 App_Code 資料夾

    project 上按右鍵 –> Add –> Add ASP.NET Folder –> Add_Code

    1addappcode

  2. 加入 InitialData.cs

    public static class InitialData
    {
        public static DateTime IniTime { get; set; } = DateTime.Now;
    }
    

在 MVC 的 Razor View 上一切正常

  1. 在 cshtml 頁面上引用 App_Code 的 namespace

    @using WebApplication3.App_Code
    
  2. 透過 Razor 語法將資料顯示出來

    @InitialData.IniTime.ToString()
    

    2razorview

  3. 實際結果

    3result

問題

  1. 根據 ASP.NET MVC 的 lifecycle 應該將紀錄的動作寫在 Global.asax 或是 Startup 中
  2. 無論是何者皆無法正確參考 namespace 及 class

    4global

    5startup

解決方式

  • 將需要被其他 class 參考使用的檔案屬性 - Build Action 設定為 Compile

    6property

    7compile

    • compile 已不會出錯誤訊息,但 visual studio 編輯視窗仍會出現紅色錯誤
  • Razor View 使用則反而出現問題:type 出現在兩個 dll 中

    8twodll

    • 解決方式一:將程式碼移出 App_Code
    • 解決方式二:將使用 App_Code 的程式碼改由 Controller 存取

心得

仔細想想似乎自從開始寫 MVC 後就不常使用 App_Code 了,雖然偶爾會寫到 Razor function ,但整體來說頻率還是低很多了

App_Code 與 Razor View 相似都是即時動態編譯,所以也就出現今天遇到的 View 與其他 class 在存取指定 class 時行為不一致的現象,久久回味一下溫故知新也不賴XD

參考資訊

  1. Classes residing in App_Code is not accessible
  2. ASP.NET 網站中的共用程式碼資料夾