ASP.NET Core MVC專案基礎
概述
本文主要說明專案結構簡述、控制器配置、資料庫連線、簡單頁面搭建。
專案結構
新建ASP.NET Core Web App(MVC)
專案後,其目錄及檔案結構如下:
Project
|-- Dependencies 組織專案的外部依賴項
|-- Analyzers 存放用於程式碼分析和診斷的工具
|-- Frameworks 存放專案依賴的外部框架和庫
|-- Properties 組織與專案屬性相關的配置檔案
|-- launchSettings.json 專案啟動配置
|-- wwwroot 組織靜態檔案
|-- css 存放CSS樣式檔案,用於定義網頁的樣式和佈局
|-- site.css
|-- js 存放JavaScript檔案,用於實現網頁的客戶端邏輯
|-- site.js
|-- lib 存放第三方JavaScript庫或其他資原始檔
|-- favicon.io 網站的圖示檔案,顯示在瀏覽器標籤頁上
|-- Controllers 組織控制器類,它們負責處理使用者的請求,並返回響應
|-- Models 組織表示應用程式資料和業務邏輯的類
|-- Views 組織檢視檔案
|-- Home 存放與首頁相關的檢視檔案
|-- Shared 存放可以被多個檢視共享的佈局和部分檢視檔案
|-- _Layout.cshtml 佈局檔案,定義了網頁的通用結構和外觀
|-- _ValidationScriptsPartial.cshtml 包含驗證指令碼的區域性檢視
|-- Error.cshtml 用於顯示錯誤資訊的檢視
|-- _ViewImports.cshtml 用於匯入檢視中的共享指令和名稱空間
|-- _ViewStart.cshtml 在每個檢視被渲染之前執行的程式碼,通常用於設定檢視的通用屬性
|-- appsettings.json 應用程式的配置設定
|-- Program.cs 應用程式的入口點,負責配置和啟動Web應用程式
注: 檔案帶字尾名
配置檔案說明
launchSettings.json
作用: 僅在本地電腦上使用,用於啟動和除錯應用程式,當專案釋出部署時,該檔案無用。
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:25000",
"sslPort": 0
}
},
"profiles": {
"ProjectName": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:7145",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
配置檔案結構如下:
|--
|-- iisSettings
|-- profiles
|-- ProjectName
|-- IIS Express
- iisSettings:表示與IIS(Internet Information Services)相關的配置設定。這些設定僅適用於當應用程式在IIS或IIS Express伺服器上執行。
- profiles:表示Visual Studio開發環境下兩種不同的啟動配置:
- ProjectName:直接執行.NET Core CLI(命令列介面)的配置,通常用於啟動和控制檯應用程式或使用Kestrel作為Web伺服器的ASP.NET Core應用程式。
- IIS Express:使用IIS Express作為Web伺服器的配置
appsettings.json
作用: 在生成環境中使用,儲存應用程式的全域性配置。
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Program.cs檔案說明
Program.cs 檔案作為應用程式的入口點,負責配置和啟動Web應用程式。
在Program.cs檔案獲取appsettings.json檔案配置項
- 在appsettings.json中新增一個名為
TempStr
的鍵值對
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"TempStr": "Hello TempStr"
}
- 在Program.cs中獲取
TempStr
的值
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// 新增控制器和檢視服務
builder.Services.AddControllersWithViews();
var app = builder.Build();
// 獲取 TempStr值
string temp = app.Configuration["TempStr"];
// 配置HTTP請求管道
app.MapGet("/", async context =>
{
await context.Response.WriteAsync(temp);
});
app.Run();
}
}
配置SQLite資料庫
定義資料模型
在Model資料夾
下,新建Player.cs檔案
public class Player
{
[Key]
public int Id { get; set; }
[NotNull]
public string Name { get; set; }
public string? Description { get; set; }
}
建立資料庫上下文
- 在Visual Studio中,開啟NuGet包管理器,安裝
Microsoft.EntityFramework.Core
包
- 在專案中新建
Data資料夾
,在Data資料夾
下新建DbContext.cs檔案
public class DatabaseContext:DbContext
{
public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options) { }
// 資料庫中儲存玩家資訊的表,表名:Players
public DbSet<Player> Players { get; set; }
}
建立資料庫種子
在Data資料夾
下新建SeedData.cs檔案
public class SeedData
{
// 注入資料庫上下文例項,以便運算元據庫
private readonly DatabaseContext _dbContext;
public SeedData(DatabaseContext dbContext)
{
_dbContext = dbContext;
}
public void InitialData()
{
// 檢查是否已有資料,如果有,則不新增種子資料
if (!_dbContext.Players.Any())
{
// 新增種子資料
_dbContext.Players.AddRange(
new Player { Id = 1, Name = "John Doe" },
new Player { Id = 2, Name = "Jane Smith" },
new Player { Id = 3, Name = "Alice Johnson" }
);
// 儲存更改到資料庫
_dbContext.SaveChanges();
}
}
}
配置SQLite連線
- 在Visual Studio中,開啟NuGet包管理器,安裝
Microsoft.EntityFramework.Sqlite
包
-
在專案中新建
Database資料夾
,用來存放Sqlite資料庫檔案 -
在appsettings.json檔案中配置資料庫連線路徑
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "Data Source=./Database/project_db.db"
}
}
- 在Program.cs檔案中配置SQLite連線,並且初始化資料庫,以下只列出與配置資料庫有關的程式碼:
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// 新增資料庫上下文服務到依賴注入容器
builder.Services.AddDbContext<DatabaseContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("DefaultConnection")));
// 註冊資料庫種子服務
builder.Services.AddTransient<SeedData>();
var app = builder.Build();
// 初始化資料庫
using (var scope = app.Services.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<DatabaseContext>();
var seedata = scope.ServiceProvider.GetService<SeedData>();
dbContext.Database.EnsureCreated();
seedata.InitialData();
}
app.Run();
}
}
配置控制器
- 在Program.cs檔案中註冊控制器服務,以下只列出與控制器配置有關的程式碼:
var builder = WebApplication.CreateBuilder(args);
// 新增控制器和檢視服務
builder.Services.AddControllersWithViews();
var app = builder.Build();
// 配置HTTP請求管道,對映屬性路由的控制器
app.MapControllers();
app.Run();
- 在專案的
Controllers資料夾
下,新增PlayerPageController.cs檔案
public class PlayerPageController : Controller
{
// 配置屬性路由
[Route("PlayerPage")]
public IActionResult Index()
{
return View();
}
}
- 在專案的
Views資料夾
下,新建PlayerPage資料夾
,在\Views\PlayerPage目錄下,新建Index.cshtml檔案
<h2>Player</h2>
<p>This is the player page.</p>
- 啟動專案,在瀏覽器中輸入
https://localhost:埠號/PlayerPage
例項
獲取資料庫中所有的Player資訊,並顯示在頁面上。
- 整合Program.cs檔案
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// 新增控制器和檢視服務
builder.Services.AddControllersWithViews();
// 新增資料庫上下文服務到依賴注入容器
builder.Services.AddDbContext<DatabaseContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("DefaultConnection")));
// 註冊資料庫種子服務
builder.Services.AddTransient<SeedData>();
// 註冊PlayerPageController到依賴注入容器
builder.Services.AddScoped<PlayerPageController>();
var app = builder.Build();
// 配置HTTP請求管道,對映屬性路由的控制器
app.MapControllers();
// 初始化資料庫
using (var scope = app.Services.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<DatabaseContext>();
var seedata = scope.ServiceProvider.GetService<SeedData>();
dbContext.Database.EnsureCreated();
seedata.InitialData();
}
app.Run();
}
}
- 修改PlayerPageController.cs檔案
public class PlayerPageController : Controller
{
private readonly DatabaseContext _dbContext;
public PlayerPageController(DatabaseContext dbContext)
{
_dbContext = dbContext;
}
[Route("PlayerPage")]
public IActionResult Index()
{
var players = _dbContext.Players;
return View(players);
}
}
- 修改Views/PlayerPage/Index.cshtml檔案
@model IEnumerable<ProjectName.Models.Player>
<h2>Player</h2>
<p>This is the player page.</p>
@{
foreach(var play in Model)
{
<p>@play.Name</p>
}
}
參考文章
launchsettings.json與appsettings.json的區別: https://stackoverflow.com/questions/46955538/launchsettings-json-appsettings-json-web-config
ASP.NET Core中的launchSettings.json:
https://www.cnblogs.com/lzjsky/p/15783134.html
ASP.NET Core中使用appsettings.json:
https://www.cnblogs.com/lzjsky/p/15783142.html
ASP.NET Core 中的 Startup 類和 Program.cs 是什麼:
https://www.c-sharpcorner.com/article/what-is-startup-class-and-program-cs-in-asp-net-core/