从零搭建.NET 10全栈应用:基于ASP.NET Core MVC与EF Core的图书管理系统实战
最近在带新人做项目时发现很多刚接触 .NET 全栈开发的同学面对 C#、ASP.NET Core、EF Core、SQL Server 这一套技术栈常常感到无从下手。环境配置、项目结构、前后端交互、数据库操作每个环节都可能卡住。本文将以一个完整的“简易图书管理系统”为例手把手带你从零搭建一个基于 .NET 10、ASP.NET Core MVC、EF Core 和 SQL Server 2025 的全栈应用并用 Bootstrap 快速美化前端界面。无论你是刚学完 C# 语法的新手还是想了解 .NET 全栈开发流程的开发者都能通过本文获得一套可运行、可复现的实战代码理解从数据库设计到页面展示的完整闭环。1. 技术栈概览与项目目标在开始编码之前我们先明确一下本教程将使用的核心技术及其在项目中的角色。1.1 核心技术组件介绍C#: 我们的后端业务逻辑和前端 Razor 页面的主要编程语言。它是一种强类型、面向对象的语言由 .NET 运行时执行。.NET 10 / ASP.NET Core MVC: 这是我们的 Web 应用框架。.NET 10 是运行时和 SDK 的版本提供了跨平台运行的基础。ASP.NET Core MVC 是基于此框架的一种设计模式它将应用分为模型Model、视图View和控制器Controller帮助我们构建结构清晰、易于测试的 Web 应用。Entity Framework Core (EF Core): 官方推荐的 .NET 对象关系映射器ORM。它允许我们使用 C# 类称为“实体”来操作数据库而无需编写大量的原始 SQL 代码。它会自动将我们的对象操作转换为对 SQL Server 的 SQL 命令。SQL Server 2025: 我们项目的关系型数据库。它用于持久化存储我们的数据如图书信息。SQL Server 2025 是微软数据库的最新版本之一提供了强大的数据管理能力。本教程同样适用于 SQL Server 2019、2022 等版本。Bootstrap 5: 一个流行的前端 CSS 框架。我们将用它来快速构建美观、响应式的用户界面而无需深入编写复杂的 CSS。它通过预定义的 CSS 类和 JavaScript 组件来工作。1.2 项目目标简易图书管理系统我们将构建一个具备基础 CRUD创建、读取、更新、删除功能的图书管理系统。具体功能包括展示图书列表在首页以表格形式列出所有图书。添加新图书通过表单提交新图书的信息如书名、作者、价格等到数据库。编辑现有图书修改某本图书的详细信息。删除图书从系统中移除一本图书。通过实现这个系统你将完整地走一遍全栈开发的核心流程数据库设计 → 创建数据模型 → 配置数据库上下文 → 生成数据库 → 编写控制器逻辑 → 设计 Razor 视图 → 使用 Bootstrap 美化界面。2. 开发环境准备工欲善其事必先利其器。请确保你的开发环境已就绪。2.1 软件安装清单.NET SDK 10.0 或更高版本这是编译和运行 .NET 应用的核心。前往 微软官方 .NET 下载页面 下载并安装。安装后在命令行执行dotnet --version应能显示版本号如10.0.3xx。集成开发环境 (IDE)Visual Studio 2022 (社区版免费)功能最全对 .NET 开发支持最好。确保安装时勾选了“ASP.NET 和 Web 开发”工作负载。Visual Studio Code轻量级跨平台编辑器。需要安装 C# 扩展包由 Microsoft 发布。适合喜欢轻量环境的开发者。SQL Server 2025 Developer / Express Edition用于本地数据库。可以从 微软 SQL Server 下载页面 获取。安装时选择“基本”安装类型通常最简单。请务必记住你设置的 SQL Server 身份验证密码如果使用混合模式。安装完成后可以通过 SQL Server Management Studio (SSMS) 或 Visual Studio 内置的 SQL Server 对象资源管理器来连接和管理数据库。可选SQL Server Management Studio (SSMS)一个用于管理 SQL Server 的图形化工具比 Visual Studio 的数据库工具更专业。建议下载安装。2.2 验证环境打开命令行CMD、PowerShell 或终端依次执行以下命令验证环境# 检查 .NET SDK 是否安装成功 dotnet --version # 检查 .NET 运行时信息 dotnet --info # 列出已安装的模板确认 ASP.NET Core 模板可用 dotnet new --list | findstr web如果以上命令都能正确执行并输出信息说明基础环境已准备就绪。3. 创建项目与初始配置我们将使用命令行和 .NET CLI 来创建项目这是最通用和可控的方式。3.1 创建解决方案与项目打开命令行导航到你希望创建项目的目录例如D:\Projects。执行以下命令# 1. 创建一个名为 BookManagementSystem 的解决方案文件 dotnet new sln -n BookManagementSystem # 2. 创建一个名为 BookManagementSystem.Web 的 ASP.NET Core MVC 项目 dotnet new mvc -n BookManagementSystem.Web -f net10.0 # 3. 将创建的项目添加到解决方案中 dotnet sln add .\BookManagementSystem.Web\执行后你的目录结构应类似于BookManagementSystem/ ├── BookManagementSystem.sln └── BookManagementSystem.Web/ ├── Controllers/ ├── Models/ ├── Views/ ├── wwwroot/ ├── appsettings.json ├── Program.cs └── BookManagementSystem.Web.csproj3.2 添加必要的 NuGet 包我们需要为项目添加 EF Core 和 SQL Server 相关的包。在BookManagementSystem.Web项目目录下执行# 进入项目目录 cd .\BookManagementSystem.Web\ # 添加 EF Core 设计时工具包用于生成数据库迁移 dotnet add package Microsoft.EntityFrameworkCore.Design # 添加 EF Core SQL Server 数据提供程序 dotnet add package Microsoft.EntityFrameworkCore.SqlServer # 添加 EF Core 工具用于执行迁移命令 dotnet add package Microsoft.EntityFrameworkCore.Tools这些命令会修改BookManagementSystem.Web.csproj文件添加相应的包引用。你可以打开该文件查看Project SdkMicrosoft.NET.Sdk.Web PropertyGroup TargetFrameworknet10.0/TargetFramework !-- 其他属性 -- /PropertyGroup ItemGroup !-- 其他包引用 -- PackageReference IncludeMicrosoft.EntityFrameworkCore.Design Version10.0.0 IncludeAssetsruntime; build; native; contentfiles; analyzers; buildtransitive/IncludeAssets PrivateAssetsall/PrivateAssets /PackageReference PackageReference IncludeMicrosoft.EntityFrameworkCore.SqlServer Version10.0.0 / PackageReference IncludeMicrosoft.EntityFrameworkCore.Tools Version10.0.0 IncludeAssetsruntime; build; native; contentfiles; analyzers; buildtransitive/IncludeAssets PrivateAssetsall/PrivateAssets /PackageReference /ItemGroup /Project注意包版本号如10.0.0可能会随 .NET 10 的更新而变化。使用dotnet add package命令会自动安装与你的目标框架兼容的最新稳定版。3.3 配置数据库连接字符串数据库连接字符串告诉我们的应用程序如何连接到 SQL Server。我们将其存储在appsettings.json配置文件中。打开BookManagementSystem.Web/appsettings.json文件。在Logging节点后添加一个ConnectionStrings节点。请根据你的 SQL Server 安装情况修改连接字符串。{ Logging: { LogLevel: { Default: Information, Microsoft.AspNetCore: Warning } }, ConnectionStrings: { DefaultConnection: Server(localdb)\\mssqllocaldb;DatabaseBookManagementDb;Trusted_ConnectionTrue;MultipleActiveResultSetstrue;TrustServerCertificateTrue },AllowedHosts: * } 连接字符串详解 *Server(localdb)\\mssqllocaldb连接到本地 SQL Server LocalDB 实例。这是 Visual Studio 安装时自带的一个轻量级 SQL Server非常适合开发。如果你安装了完整的 SQL Server 2025可以改为Serverlocalhost;或Server你的服务器名\\实例名;。 *DatabaseBookManagementDb指定要连接到的数据库名称。如果不存在EF Core 迁移可以创建它。 *Trusted_ConnectionTrue使用 Windows 身份验证。如果安装 SQL Server 时设置了 SQL 身份验证用户名/密码则需要使用User Id用户名;Password密码;。 *MultipleActiveResultSetstrue允许在同一连接上执行多个查询提升性能。 *TrustServerCertificateTrue在开发环境中信任服务器证书避免 SSL 连接问题。4. 定义数据模型与数据库上下文这是连接 C# 代码与数据库表的关键一步。4.1 创建实体模型Model在Models文件夹下创建一个新的 C# 类文件Book.cs。这个类将代表数据库中的Books表。// 文件路径Models/Book.cs using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace BookManagementSystem.Web.Models { public class Book { // 主键自增 [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } // 书名必填字段 [Required(ErrorMessage 书名是必填项)] [StringLength(200, ErrorMessage 书名长度不能超过200个字符)] [Display(Name 书名)] public string Title { get; set; } string.Empty; // 作者 [Required(ErrorMessage 作者是必填项)] [StringLength(100, ErrorMessage 作者名长度不能超过100个字符)] [Display(Name 作者)] public string Author { get; set; } string.Empty; // 价格使用 decimal 类型存储货币 [Required(ErrorMessage 价格是必填项)] [Range(0.01, 10000, ErrorMessage 价格必须在0.01到10000之间)] [Column(TypeName decimal(18, 2))] // 指定数据库中的精度和小数位数 [Display(Name 价格)] public decimal Price { get; set; } // 出版日期 [Required(ErrorMessage 出版日期是必填项)] [DataType(DataType.Date)] [Display(Name 出版日期)] public DateTime PublishDate { get; set; } DateTime.Now; // ISBN 号可选 [StringLength(13, ErrorMessage ISBN长度应为13位)] [Display(Name ISBN)] public string? ISBN { get; set; } // 可空类型表示该字段可选 // 简介可选 [DataType(DataType.MultilineText)] [Display(Name 简介)] public string? Description { get; set; } } }代码说明我们使用了数据注解Data Annotations来定义验证规则和显示名称。如[Required],[StringLength],[Display]。这些注解不仅会被 EF Core 用于生成数据库架构还会被 ASP.NET Core MVC 的视图引擎用于生成带有验证功能的表单。[Column(TypeName decimal(18, 2))]确保Price在数据库中存储为精确的十进制数避免浮点数精度问题。string?中的?表示该属性是可空的Nullable在数据库中对应允许为 NULL 的列。4.2 创建数据库上下文DbContext数据库上下文是 EF Core 的核心它代表与数据库的一个会话用于查询和保存实体。在Models文件夹或新建一个Data文件夹下创建ApplicationDbContext.cs文件。// 文件路径Models/ApplicationDbContext.cs (或 Data/ApplicationDbContext.cs) using Microsoft.EntityFrameworkCore; namespace BookManagementSystem.Web.Models { public class ApplicationDbContext : DbContext { // 构造函数接收配置选项 public ApplicationDbContext(DbContextOptionsApplicationDbContext options) : base(options) { } // 将 Book 实体映射到数据库中的 Books 表 public DbSetBook Books { get; set; } // 可选可以在这里用 Fluent API 进行更复杂的模型配置 protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 示例为 Title 和 Author 创建复合索引 modelBuilder.EntityBook() .HasIndex(b new { b.Title, b.Author }) .IsUnique(false); // 非唯一索引 } } }4.3 在 Program.cs 中注册 DbContext 服务我们需要在依赖注入容器中注册ApplicationDbContext以便在控制器中可以使用它。打开Program.cs文件在var builder WebApplication.CreateBuilder(args);之后添加服务注册代码// 文件路径Program.cs using BookManagementSystem.Web.Models; using Microsoft.EntityFrameworkCore; var builder WebApplication.CreateBuilder(args); // 添加 MVC 服务 builder.Services.AddControllersWithViews(); // 从 appsettings.json 读取连接字符串 var connectionString builder.Configuration.GetConnectionString(DefaultConnection); // 注册 ApplicationDbContext并配置使用 SQL Server builder.Services.AddDbContextApplicationDbContext(options options.UseSqlServer(connectionString)); var app builder.Build(); // ... 后续的中间件配置如开发人员异常页、HTTPS重定向、静态文件、路由等保持不变 // app.UseHttpsRedirection(); // app.UseStaticFiles(); // app.UseRouting(); // app.MapControllerRoute(...); app.Run();5. 使用 EF Core 迁移创建数据库现在我们已经定义了模型和上下文接下来让 EF Core 为我们创建数据库和表。5.1 创建初始迁移在命令行中确保当前目录是BookManagementSystem.Web项目根目录然后执行dotnet ef migrations add InitialCreate这条命令会做以下几件事分析ApplicationDbContext和所有它引用的DbSetT实体这里就是Book。与上一次迁移目前是第一次所以是空状态进行比较计算出需要应用到数据库的更改即创建Books表。在项目根目录下创建一个Migrations文件夹并在其中生成两个或更多文件XXXXXXXXXXXXXX_InitialCreate.cs迁移文件包含Up和Down方法。Up用于应用迁移创建表Down用于回滚迁移删除表。ApplicationDbContextModelSnapshot.cs当前模型状态的快照。5.2 将迁移应用到数据库执行以下命令让 EF Core 根据迁移文件在 SQL Server 中实际创建数据库和表dotnet ef database update执行结果如果连接字符串配置正确EF Core 会连接到 SQL Server或 LocalDB。如果BookManagementDb数据库不存在则会创建它。然后在数据库中创建Books表表结构根据Book类的属性和数据注解生成。同时还会创建一个__EFMigrationsHistory表用于记录哪些迁移已经被应用。验证你可以使用 SQL Server Management Studio (SSMS) 或 Visual Studio 的“SQL Server 对象资源管理器”连接到你的数据库服务器应该能看到新创建的BookManagementDb数据库以及其中的Books表。6. 实现控制器与视图CRUD 功能我们将遵循 MVC 模式创建控制器来处理 HTTP 请求并创建视图来呈现用户界面。6.1 生成 Books 控制器和视图脚手架ASP.NET Core 提供了强大的脚手架工具可以基于模型自动生成包含 CRUD 操作的控制器和视图。这是快速上手的绝佳方式。在BookManagementSystem.Web项目目录下执行# 安装 ASP.NET Core 代码生成器工具如果尚未安装 dotnet tool install --global dotnet-aspnet-codegenerator # 使用脚手架生成控制器和视图 dotnet aspnet-codegenerator controller -name BooksController -m Book -dc ApplicationDbContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries命令参数解释-name BooksController指定控制器名。-m Book指定模型类。-dc ApplicationDbContext指定数据库上下文类。--relativeFolderPath Controllers在Controllers文件夹下生成。--useDefaultLayout使用默认的_Layout.cshtml布局页。--referenceScriptLibraries在视图中引用客户端验证脚本库如 jQuery Validation。执行成功后你会在Controllers文件夹下看到新生成的BooksController.cs文件在Views文件夹下看到新的Books子文件夹里面包含了Index.cshtml列表、Create.cshtml创建、Edit.cshtml编辑、Delete.cshtml删除、Details.cshtml详情等视图文件。6.2 分析生成的控制器代码打开Controllers/BooksController.cs你会看到它已经包含了完整的 CRUD 动作方法ActionIndex(): GET 请求获取所有图书列表。Details(int? id): GET 请求查看单本图书详情。Create(): GET 请求返回创建表单。Create(Book book): POST 请求处理表单提交创建新图书。Edit(int? id): GET 请求返回编辑表单。Edit(int id, Book book): POST 请求处理编辑提交。Delete(int? id): GET 请求返回删除确认页。DeleteConfirmed(int id): POST 请求执行删除操作。这些方法都使用了依赖注入的ApplicationDbContext来与数据库交互。代码已经处理了基本的验证、异常和重定向。6.3 使用 Bootstrap 美化视图脚手架生成的视图是功能性的但样式比较基础。我们使用 Bootstrap 5 来快速美化它们。Bootstrap 已经包含在 ASP.NET Core MVC 项目的默认模板中在wwwroot/lib/bootstrap下并通过_Layout.cshtml中的链接引用。我们以Views/Books/Index.cshtml为例进行美化* 文件路径Views/Books/Index.cshtml * model IEnumerableBookManagementSystem.Web.Models.Book { ViewData[Title] 图书列表; } div classcontainer mt-4 h1 classmb-4ViewData[Title]/h1 p a asp-actionCreate classbtn btn-success i classbi bi-plus-circle/i 添加新图书 /a /p div classtable-responsive table classtable table-striped table-hover thead classtable-dark tr thHtml.DisplayNameFor(model model.Title)/th thHtml.DisplayNameFor(model model.Author)/th thHtml.DisplayNameFor(model model.Price)/th thHtml.DisplayNameFor(model model.PublishDate)/th th操作/th /tr /thead tbody foreach (var item in Model) { tr tdHtml.DisplayFor(modelItem item.Title)/td tdHtml.DisplayFor(modelItem item.Author)/td tdHtml.DisplayFor(modelItem item.Price)/td tditem.PublishDate.ToString(yyyy-MM-dd)/td td div classbtn-group btn-group-sm rolegroup a asp-actionDetails asp-route-iditem.Id classbtn btn-info i classbi bi-eye/i 详情 /a a asp-actionEdit asp-route-iditem.Id classbtn btn-warning i classbi bi-pencil-square/i 编辑 /a a asp-actionDelete asp-route-iditem.Id classbtn btn-danger i classbi bi-trash/i 删除 /a /div /td /tr } /tbody /table /div /div section Scripts { * 可以在这里添加页面特定的脚本例如确认删除对话框 * script // 为删除按钮添加确认对话框 document.querySelectorAll(.btn-danger).forEach(button { button.addEventListener(click, function (event) { if (!confirm(确定要删除这条记录吗此操作不可恢复。)) { event.preventDefault(); } }); }); /script }美化要点容器与间距使用.container和.mt-4(margin-top) 控制布局。按钮样式使用btn btn-success、btn btn-info等类。表格样式使用table table-striped table-hover使表格更易读table-responsive使其在小屏幕上可滚动。图标使用了 Bootstrap Icons通过bi类。你需要确保在_Layout.cshtml的head中引入了 Bootstrap Icons 的 CSS默认模板可能没有。可以在_Layout.cshtml中添加link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/bootstrap-icons1.10.0/font/bootstrap-icons.css操作按钮组使用btn-group将操作按钮组合在一起。客户端脚本在section Scripts中添加了简单的 JavaScript 来确认删除操作。类似地你可以修改Create.cshtml和Edit.cshtml中的表单使用 Bootstrap 的表单控件类如form-control、form-label、form-text、text-danger用于验证错误信息等。6.4 更新导航菜单为了让用户能访问图书管理页面我们将其添加到主布局的导航栏中。打开Views/Shared/_Layout.cshtml找到导航菜单部分通常在nav或ul classnavbar-nav内添加一个链接li classnav-item a classnav-link text-dark asp-area asp-controllerBooks asp-actionIndex图书管理/a /li7. 运行与测试7.1 启动应用程序在项目根目录下执行dotnet run或者直接在 Visual Studio 中按F5或点击运行按钮。应用程序将在默认地址通常是https://localhost:5001和http://localhost:5000启动。7.2 功能测试在浏览器中打开https://localhost:5001。点击导航栏上的“图书管理”。列表页 (Index)应显示一个空表格因为还没有数据。点击“添加新图书”。创建页 (Create)填写表单尝试提交空表单观察客户端验证如红色边框和错误信息是否生效。填写有效数据后提交。列表页 (Index)提交后应跳转回列表页并看到新添加的图书。编辑页 (Edit)点击某条记录的“编辑”按钮修改信息后提交。删除 (Delete)点击“删除”按钮在弹出的确认对话框中点击“确定”记录应被删除。详情页 (Details)点击“详情”按钮查看图书的完整信息。通过以上步骤你已经完成了一个具备完整 CRUD 功能的 ASP.NET Core MVC 应用。8. 常见问题与排查思路在开发过程中你可能会遇到以下常见问题问题现象可能原因解决思路dotnet ef命令未找到未安装 EF Core 工具包或未在项目目录下执行。1. 在项目目录执行dotnet tool install --global dotnet-ef。2. 确保在包含.csproj文件的项目根目录执行命令。迁移时出现数据库连接错误连接字符串配置错误SQL Server 服务未启动身份验证方式不对。1. 检查appsettings.json中的ConnectionStrings:DefaultConnection。2. 使用 SSMS 尝试用相同参数连接验证服务器、数据库名、用户名密码是否正确。3. 确保 SQL Server (MSSQLSERVER) 或 SQL Server (SQLEXPRESS) 服务正在运行可在“服务”管理中查看。4. 对于 LocalDB有时需要以管理员身份运行sqllocaldb start MSSQLLocalDB来启动实例。运行时出现SqlException数据库/表不存在迁移未应用表结构不匹配。1. 执行dotnet ef database update确保迁移已应用。2. 检查__EFMigrationsHistory表确认InitialCreate迁移已存在。3. 对比Books表结构与Book模型是否一致。页面显示“无法加载文件或程序集 ‘Microsoft.EntityFrameworkCore.SqlServer’”NuGet 包未正确还原或版本冲突。1. 在项目目录执行dotnet restore。2. 检查.csproj文件中的包版本是否兼容。尝试将所有Microsoft.EntityFrameworkCore.*包版本统一为同一个主版本如10.0.0。3. 清理解决方案并重新生成。表单提交后验证错误信息不显示视图中未包含必要的验证脚本引用或ValidationSummary。1. 确保在_Layout.cshtml或视图底部包含了section Scripts { ... }并且其中引用了 jQuery 和 jQuery 验证脚本脚手架生成的视图通常已包含。2. 在表单上方添加div asp-validation-summaryModelOnly classtext-danger/div。Bootstrap 样式未生效Bootstrap CSS/JS 文件未正确引入网络问题导致 CDN 加载失败。1. 检查_Layout.cshtml中 Bootstrap 的link和script标签路径是否正确。2. 考虑将 Bootstrap 文件下载到本地wwwroot/lib文件夹并引用本地路径避免 CDN 问题。3. 使用浏览器开发者工具F12的“网络”选项卡查看 CSS/JS 文件是否成功加载。9. 最佳实践与进阶建议完成基础功能后以下建议可以帮助你构建更健壮、更易维护的应用。9.1 项目结构与分层对于更复杂的项目建议采用清晰的分层架构例如BookManagementSystem.Web (表示层)包含 Controllers, Views, wwwroot。职责处理 HTTP 请求/响应呈现 UI。BookManagementSystem.Core (领域层)包含 Entities实体、Interfaces接口、Services领域服务。职责封装核心业务逻辑和规则。BookManagementSystem.Infrastructure (基础设施层)包含 DataDbContext、仓储实现、ExternalServices。职责处理数据持久化、文件访问、外部 API 调用等。BookManagementSystem.Shared (共享层)包含 DTOs数据传输对象、Enums枚举、通用工具类。这样分离关注点使得各层职责单一便于测试和维护。9.2 使用仓储模式与依赖注入不要在控制器中直接使用DbContext。创建一个IRepositoryT接口和其实现RepositoryT将数据访问逻辑封装起来。然后在Program.cs中将其注册为服务通过构造函数注入到控制器中。这提高了代码的可测试性和可替换性。9.3 异步编程EF Core 和 ASP.NET Core 都广泛支持异步操作。将控制器中的同步方法如ToList()改为异步方法如ToListAsync()并在 Action 方法上使用async/await可以提升应用的吞吐量和响应能力。// 同步方式 public IActionResult Index() { var books _context.Books.ToList(); return View(books); } // 异步方式推荐 public async TaskIActionResult Index() { var books await _context.Books.ToListAsync(); return View(books); }9.4 输入验证与安全始终使用模型验证像我们在Book模型上做的利用数据注解进行服务端和客户端双重验证。防范跨站请求伪造 (CSRF)ASP.NET Core 默认在表单中通过Html.AntiForgeryToken()和[ValidateAntiForgeryToken]特性提供保护确保不要禁用此功能。参数化查询EF Core 默认使用参数化查询有效防止 SQL 注入。永远不要使用字符串拼接来构建 SQL 查询。HTTPS在生产环境中强制使用 HTTPS。9.5 错误处理与日志记录使用异常过滤器创建全局异常过滤器统一处理未处理的异常并向用户返回友好的错误页面同时记录详细的错误信息。结构化日志使用 ASP.NET Core 内置的ILoggerT接口进行日志记录并配置像 Serilog 这样的第三方库将日志输出到文件、数据库或集中式日志系统如 ELK Stack。9.6 前端优化捆绑与压缩使用 ASP.NET Core 的 Bundler Minifier 或 WebOptimizer 来捆绑和压缩 CSS、JS 文件减少 HTTP 请求数和文件大小。客户端缓存为静态资源如图片、CSS、JS设置适当的缓存头。考虑前端框架对于复杂的交互界面可以考虑集成像 Vue.js、React 或 Blazor 这样的前端框架构建更动态的单页应用SPA。至此你已经成功搭建了一个基于 .NET 10 全栈技术的图书管理系统。这个项目虽然简单但涵盖了现代 .NET Web 开发的核心流程环境搭建、项目创建、模型定义、ORM 配置、数据库迁移、控制器编写、视图渲染以及前端美化。理解了这个流程你就掌握了 .NET 全栈开发的骨架可以在此基础上不断添加新的功能模块如用户认证、分类管理、搜索分页、API 接口等逐步构建出更复杂的商业应用。