ASP.NET Core 2.0 : 三. 項目結構

来源:https://www.cnblogs.com/FlyLolo/archive/2018/02/09/8427465.html
-Advertisement-
Play Games

本章我們一起來對比著ASP.NET Framework版本看一下ASP.NET Core 2.0的項目結構.(此後的文章也儘量這樣對比著, 方便學習理解.) 關註差異, 也為項目遷移做準備. 新建項目, 選擇類型 新建項目, 選擇.NET Core 有如下幾種類型可選, 分別是Console, AS ...


本章我們一起來對比著ASP.NET Framework版本看一下ASP.NET Core 2.0的項目結構.(此後的文章也儘量這樣對比著, 方便學習理解.)

關註差異, 也為項目遷移做準備.

新建項目, 選擇類型

新建項目, 選擇.NET Core 有如下幾種類型可選, 分別是Console, ASP.NET Core 的空項目, Web API

我們選擇ASP.NET Core Web App(MVC), 沒有標註MVC的是採用Razor pages 的項目.

 

項目結構圖

新建的項目結構如下圖所示, 大體上和ASP.NET 的Framework版本差不多, 現在按照圖上的數字標記逐一做一下介紹(Controller、Model就不介紹了, View中單獨介紹一下幾個特殊View).

按照標註的數字逐個做一下簡單介紹, 先瞭解大概是乾什麼用的, 後面的文章會做詳細的研究.

介紹的時候我會對比大家熟悉的ASP.NET Framework版本, 方便理解.

① Dependencies 依賴項

這裡主要分兩部分, NuGet和SDK, 目前這兩部分下麵都只有一項.

Nuget:

包含Microsoft.AspNetCore.All, 展開它看一下, 裡面MVC、Razor、EF以及SQLLite都要,

官方這樣說: 它包含了

  • ASP.NET Core 團隊支持的所有包。
  • Entity Framework Core 支持的所有包。
  • ASP.NET Core 和 Entity Framework Core 使用的內部和第三方依賴關係。 

猛地一看, 這是一非常大而全的包了, 和之前說的模塊化有點不一致, 而且無緣無故的讓自己的項目引用了一些根本用不到的程式集, 非常不爽.

其實這些程式集不會隨著項目發佈一起出現在部署包中, 不止沒引用的, 包括引用的也不會. 這些已經存在於部署環境中了, 所以發佈包不會變大反而會變小, 不必擔心.

SDK:

SDk中包含了一項: Microsoft.NETCore.App, 它是.NET Core 的部分庫。 也就是 .NETCoreApp 框架。 它依賴於更小的 NETStandard.Library

相對於上面的Microsoft.AspNetCore.All, 它同樣是包含了一些程式集.但它似乎更"基礎"一些.

二者異同

Microsoft.AspNetCore.All中大部分都是Microsoft.開頭的一些程式集, 而Microsoft.NETCore.App中出現的大多數是我們熟悉的system.XXX的.

二者的關係就像ASP.NET相對於.NET, 此處是Asp.NetCore相對於.Net Core. 

SDK同樣是一個大而全的集和, 在部署的時候, SDK中的引用依然不會出現在部署包中, 如下圖, 是不是很精簡

 

② launchSettings.json

顧名思義, 這是一個啟動配置文件, json格式的. 通過上面的項目結構圖可以發現, 常見的web.config或app.config等xml格式的config文件找不到了,

都是json. 打開這個json看一下. 一項項的不好解釋, 後來發現windows 中的 vs2017有個圖形化的配置界面(右鍵當前項目->屬性->調試),

一個個介紹太麻煩了, 直接上圖感受一下.

圖下部分的Web伺服器配置是我們熟悉的URL、身份認證以及SSL等配置.

圖的上部分對應json中的profiles中定義的兩種配置,分別以IIS Express和以當前項目名HelloCore命名.

切換該選項下麵的配置項也會隨之改變, 相當於是兩個頁, 每頁中的配置對應json中相應的節點. 

 

③ _Layout.cshtml

佈局模板, 簡單的說就是所有採用此模板的頁面擁有大體一致的佈局, 

舉個例子, 我們的頁面經常是這樣的結構:

Header、Footer和Navigation基本上是不變的, 打開_Layout.cshtml, 我們可以看到一個@RenderBody()標識, 它其實就是來定義Content部分的, 

繼承此模板的頁面只需要提供這部分內容即可.

當然, 常見的還有類似@RenderSection("Scripts", required: false)這樣的標識, 引用此模板的頁面可以將該頁的特定JS的引用放在對應的Section中.

引用此模板, 只需在頁首如下配置即可.

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

每個頁都配置比較麻煩? ⑥ _ViewStart.cshtml 會幫忙.

④ _ValidationScriptsPartial.cshtml

<environment include="Development">
    <script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
</environment>

打開此頁面, 可以看到一些這樣的引用, validation 顧名思義是用來做驗證的, 我們經常看到這樣的頁面

當輸入的格式不正確的時候, 給出提示, 最早我們經常是在輸入後或者提交前用js將輸入的內容正則驗證一下, 

這個不用那麼麻煩了, 我們通過如下代碼引用_ValidationScriptsPartial.cshtml, 也就是採用jquery-validation來做驗證

@section Scripts {
    @await Html.PartialAsync("_ValidationScriptsPartial")
}

註意: 預設的_Layout模板是未引用的, 因為不是所有頁面都需要有輸入操作.

Model中設置驗證方式

        [Required(ErrorMessage ="用戶名不能為空!")]
        [Display(Name = "用戶名")]
        public string UserName { get; set; }

        [EmailAddress(ErrorMessage ="Email格式不正確!")]
        [Required]
        [Display(Name = "EMail")]
        public string EMail { get; set; }

在頁面添加驗證即可:

<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
    <label asp-for="Email"></label>
    <input asp-for="Email" class="form-control" />
    <span asp-validation-for="Email" class="text-danger"></span>
</div>

validation細化起來內容還很多, 此處只是大概介紹一下, 後文會專題研究.

⑤ _ViewImports.cshtml

先不說這個, 再說一個消失了的Web.config. 就是Framework版本的MVC項目中的View目錄下的那個.

在View中引用Model等的時候, 為了避免寫using .... , 我們可以在這個config中添加這些引用

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="FrameworkMVCTest" />
        <add namespace="FrameworkMVCTest.Model" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

現在打開_ViewImports.cshtml,

@using HelloCore
@using HelloCore.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

這裡其實就是實現了上面的功能.

有一個比較特別的地方就是比原版MVC多了個@addTagHelper

在上文的validation中我們看到過這樣的代碼

    <label asp-for="Email"></label>
    <input asp-for="Email" class="form-control" />
    <span asp-validation-for="Email" class="text-danger"></span>

原來我們是這樣寫的

@Html.LabelFor(m => m.EMail)
@Html.EditorFor(m => m.EMail)
@Html.ValidationMessageFor(m=>m.EMail)

初步看來這個 TagHelper 和 HtmlHelper 有點像, 具體先瞭解這麼多, 後文細化.

⑥ _ViewStart.cshtml

這個打開就一句話,

@{
    Layout = "_Layout";
}

這個頁面中的內容會在所有View執行前執行, 現在這句話就是給所有的View一個預設的Layout模板.

所以在View中這樣寫

@{
    Layout = null;
}

和這樣寫

@{

}

是不一樣的, 第一種是告訴這個View不採用任何模板.

第二種寫法是什麼都不幹, 所以它會採用_ViewStart.cshtml中指定的模板.

 

當然, 這個_ViewStart.cshtml的作用不只是寫這麼一句話, 我們還可以在這寫一些其他需要"通用"執行的內容.

⑦ wwwroot

看這名字好像是IIS的預設網站根目錄, 它包含了所有的"前端"的靜態文件,  css、image、JS以及一個名為lib的文件夾.

lib中預設內容是bootstrap和jquery.

在Startup中, 會調用一個無參數的UseStaticFiles()方法, 將此目錄標記到網站根目錄.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //.....        
    app.UseStaticFiles();
    //.....

}

具體靜態文件的路徑及相關自定義配置, 授權等後文詳細研究.

⑧ appsettings.json和appsettings.Development.json

這就是原來的framework版本的MVC的Web.config文件了.

不過這個算是夠精簡的了, 預設情況沒幾句話,只有對於log日誌的相關配置,

當然正常項目中我們要配置的肯定不止這一點, 舉個例子, 資料庫連接

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=ContosoUniversity1;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}

 

⑨ bundleconfig.json

預設文件內容如下:

[
  {
    "outputFileName": "wwwroot/css/site.min.css",
    "inputFiles": [
      "wwwroot/css/site.css"
    ]
  },
  {
    "outputFileName": "wwwroot/js/site.min.js",
    "inputFiles": [
      "wwwroot/js/site.js"
    ],
    // Optionally specify minification options
    "minify": {
      "enabled": true,
      "renameLocals": true
    },
    // Optionally generate .map file
    "sourceMap": false
  }
]

 

這裡主要涉及兩個概念:

1.Bunding

     可以理解為綁定或者合併, 也就是把幾個文件合併成一個大文件, 減少請求次數.

     上文的代碼可以看到, inputFiles 是一個數組, 而outputFileName 是一個單獨的文件名, 

  以css為例, inputFiles裡面已經有一個文件 wwwroot/css/site.css, 假如現在頁面還需要一個wwwroot/css/skin.css,

  如果不做合併, 頁面打開的時候就需要分別請求這兩個文件, 做了合併之後, 即將這個skin.css文件也寫入數組中, 只要請求

  /css/site.min.css這一個文件即可. 

2.Minification

  翻譯為縮減, 即將代碼中註釋和多餘空格等刪除, 甚至將變數名改為一個字元來縮減文件的大小.

      例如下麵的JS代碼

AddAltToImg = function (imageTagAndImageID, imageContext) {
    ///<signature>
    ///<summary> Adds an alt tab to the image
    // </summary>
    //<param name="imgElement" type="String">The image selector.</param>
    //<param name="ContextForImage" type="String">The image context.</param>
    ///</signature>
    var imageElement = $(imageTagAndImageID, imageContext);
    imageElement.attr('alt', imageElement.attr('id').replace(/ID/, ''));
}

      縮減後的代碼:

AddAltToImg=function(n,t){var i=$(n,t);i.attr("alt",i.attr("id").replace(/ID/,""))};

      一下就減少了好多.

通過以上兩種方式組合不但減少了請求次數,還減小了請求的靜態文件的總大小, 從而提高載入時間和性能.

 

在上文查看_layout模板文件的時候我們就見過這樣的代碼:

 

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>

詳細的配置說明暫時不說, 大概的意思就是在Development模式下載入未綁定和縮減的文件, 方便閱讀和調試.

和非Development情況下,載入處理過的文件來提高性能.

⑩ Program.cs

    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }

這裡有一個非常熟悉的Main方法, 也就是應用的起點, 啟動後通過UseStartup<Startup>()指定下文的Startup啟動文件進行啟動.

⑪ Startup.cs

這是Mvc Core非常重要的地方, 包括載入配置, 通過依賴註入載入組件, 註冊路由等都在此處進行.

預設的代碼中:

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())   //指定錯誤頁
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles(); //指定靜態文件

//設置路由 app.UseMvc(routes
=> { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }

如上圖所示, 預設情況下設置了兩種不同狀態下的錯誤頁, 指定靜態文件並且設置了路由.

在這裡, 我們可以向管道中通過中間件的方式插入我們需要的工作內容.

比如我們還可以用app.UseAuthentication()來做身份驗證.

 

我們使用 UseRun 和 Map 來配置 HTTP 管道。 

Use 方法可使管道短路(即不調用 next 請求委托)。 

Run 是一種約定,並且某些中間件組件可公開在管道末尾運行的 Run[Middleware] 方法。

Map* 擴展用作約定來創建管道分支。

 

此處涉及內容非常多, 比如管道機制、路由註冊、身份認證等都需要專題研究.

⑫ .bowerrc和bower.json 

bower是一款優秀的前端包及依賴管理工具,.bowerrc指定了文件位置, bower.json則進行了詳細的配置,如下麵的bootstrap和jquery

{
  "name": "asp.net",
  "private": true,
  "dependencies": {
    "bootstrap": "3.3.7",
    "jquery": "2.2.0",
    "jquery-validation": "1.14.0",
    "jquery-validation-unobtrusive": "3.2.6"
  }
}

 詳細的使用方法就不在這裡介紹了.

 

小結:

剛新建的項目的結構大體就是這樣,  主要功能介紹完了就是一個個詳細研究了.


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

-Advertisement-
Play Games
更多相關文章
  • 1.1 基於UDP協議實現簡單的套接字通信 udp是無鏈接的,先啟動哪一端都不會報錯 udp套接字簡單示例 1.1.1.1 客戶端: from socket import * client=socket(AF_INET,SOCK_DGRAM) #數據報協議,創建一個客戶的套接字 while True ...
  • 在python中,可以使用try...except語句來處理異常。做法是,把可能引發異常的語句放在try 塊中,把處理異常的語句放在except 塊中。 當程式在try內部打開文件引發異常時,會跳過try中剩下的代碼,直接跳轉到except中的語句處理異常。於是輸出了“File not exists ...
  • Python讀寫csv文件 覺得有用的話,歡迎一起討論相互學習~ "Follow Me" 前言 逗號分隔值(Comma Separated Values,CSV,有時也稱為字元分隔值,因為分隔字元也可以不是逗號),其文件以純文本形式存儲表格數據(數字和文本)。純文本意味著該文件是一個字元序列,不含必 ...
  • 前言 在上一篇 "Kafka使用Java實現數據的生產和消費demo" 中介紹如何簡單的使用kafka進行數據傳輸。本篇則重點介紹kafka中的 consumer 消費者的講解。 應用場景 在上一篇kafka的consumer消費者,我們使用的是自動提交offset下標。 但是offset下標自動提 ...
  • Python 學習之路(一) 以下所用的是Python 3.6 一、編碼問題 二、基礎知識 2.1 標識符 在 Python 里,標識符由字母、數字、下劃線組成。 在 Python 中,所有標識符可以包括英文、數字以及下劃線(_),但不能以數字開頭。 Python 中的標識符是區分大小寫的。 2.2 ...
  • 目前正在學習python基本語法以及電腦網路課,所以正好結合學習python網路編程,看的是《python核心編程》第三版,發現示例2-1代碼返回錯誤…..糾結很久 發現這裡python3.5和Python2.7在套接字返回值解碼上有區別。 先介紹一下 python bytes和str兩種類型轉換 ...
  • 本篇導航: RESTful RESTful API設計 基於django實現 基於Django Rest Framework框架實現 一、RESTful REST與技術無關,代表的是一種軟體架構風格,REST是Representational State Transfer的簡稱,中文翻譯為“表徵狀態 ...
  • 在前後端分離開發的項目當中為了避免重覆構建發佈,我們需要部署一個持續發佈環境,而目前的開發環境伺服器 都是基於 CentOS 的,因此每次在本地發佈之後還需要打包,上傳,部署,十分繁瑣。故這裡採用了比較成熟的 Jenkins 作為持續部署環境。 為了方便安裝,我們這裡使用了 Docker 來進行安裝 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...