ASP.NET Core 电商网站开发实战与核心代码解析
ASP.NET Core 是构建现代、高性能、跨平台 Web 应用的强大框架,通过一个电商网站实例,我们深入探讨其核心实现与最佳实践,涵盖用户管理、产品展示、购物车、订单处理等关键功能。

技术架构与核心组件
-
分层架构:
- 数据访问层 (DAL): Entity Framework Core (EF Core) 负责对象关系映射(ORM),连接 SQL Server 数据库。
- 业务逻辑层 (BLL): 封装核心业务规则(如库存检查、折扣计算、订单状态流转)。
- 表示层: ASP.NET Core MVC 或 Razor Pages 处理 HTTP 请求/响应,渲染视图。
- 基础设施层: 包含通用服务(日志、缓存、邮件发送)、身份认证(Identity)配置。
-
关键技术选型:
- 框架: ASP.NET Core 6+
- ORM: Entity Framework Core 7+
- 身份认证: ASP.NET Core Identity
- 前端: Razor 语法, Bootstrap, JavaScript (可选 Vue.js/React 集成)
- 缓存: MemoryCache 或 Redis
- 支付: Stripe/PayPal 集成库
- 搜索: Elasticsearch 或 LINQ 动态查询
核心功能实现与代码剖析
-
用户认证与授权 (ASP.NET Core Identity)
- 用户注册:
RegisterModel(Razor Page) 处理表单提交,调用UserManager.CreateAsync()。public async Task<IActionResult> OnPostAsync(string returnUrl = null) { returnUrl ??= Url.Content("~/"); if (ModelState.IsValid) { var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email }; var result = await _userManager.CreateAsync(user, Input.Password); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false); return LocalRedirect(returnUrl); } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } return Page(); } - 角色管理: 使用
RoleManager创建角色 (Admin,Customer),通过UserManager.AddToRoleAsync()分配角色。 - 授权: 在控制器或 Action 上使用
[Authorize]或[Authorize(Roles = "Admin")]特性控制访问。
- 用户注册:
-
产品展示与管理
-
EF Core 模型与 DbContext:
public class Product { public int Id { get; set; } [Required, StringLength(100)] public string Name { get; set; } [DataType(DataType.Currency)] public decimal Price { get; set; } public string Description { get; set; } public string ImageUrl { get; set; } public int StockQuantity { get; set; } public int CategoryId { get; set; } public Category Category { get; set; } } public class AppDbContext : DbContext { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } public DbSet<Product> Products { get; set; } public DbSet<Category> Categories { get; set; } // ...其他DbSet } -
产品列表 (分页与搜索): 使用
PaginatedList<T>辅助类。
public async Task<IActionResult> Index(string searchString, string currentFilter, int? pageNumber) { if (searchString != null) pageNumber = 1; else searchString = currentFilter; ViewData["CurrentFilter"] = searchString; var products = from p in _context.Products select p; if (!String.IsNullOrEmpty(searchString)) { products = products.Where(p => p.Name.Contains(searchString) || p.Description.Contains(searchString)); } int pageSize = 10; return View(await PaginatedList<Product>.CreateAsync(products.AsNoTracking(), pageNumber ?? 1, pageSize)); }
-
-
购物车功能
- 实现方式:
- Session: 适合小型、临时购物车。
HttpContext.Session.SetObjectAsJson("Cart", cart)。 - 数据库 (关联用户): 持久化存储,跨设备同步,定义
Cart和CartItem实体关联到用户。
- Session: 适合小型、临时购物车。
- 添加商品到购物车 (数据库示例):
[Authorize] public async Task<IActionResult> AddToCart(int productId, int quantity = 1) { var userId = _userManager.GetUserId(User); var cart = await _context.Carts.Include(c => c.Items).FirstOrDefaultAsync(c => c.UserId == userId) ?? new Cart { UserId = userId }; var cartItem = cart.Items.FirstOrDefault(i => i.ProductId == productId); if (cartItem != null) { cartItem.Quantity += quantity; } else { cart.Items.Add(new CartItem { ProductId = productId, Quantity = quantity }); } if (cart.Id == 0) _context.Carts.Add(cart); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); }
- 实现方式:
-
订单处理流程
-
下单 (Checkout):
- 验证购物车有效性(库存充足)。
- 创建
Order和OrderDetail记录。 - 清空购物车。
- 扣减库存 (
Product.StockQuantity -= quantity)。 - (关键) 使用 事务 保证数据一致性。
[Authorize, HttpPost, ValidateAntiForgeryToken] public async Task<IActionResult> Checkout(CheckoutViewModel model) { var cart = await GetUserCartAsync(); // 获取当前用户购物车 if (cart == null || !cart.Items.Any()) return RedirectToAction("Index", "Cart");
// 1. 库存预检查
foreach (var item in cart.Items)
{
var product = await _context.Products.FindAsync(item.ProductId);
if (product.StockQuantity < item.Quantity)
{
ModelState.AddModelError(“”, $”{product.Name} 库存不足 (剩余 {product.StockQuantity})”);
return View(model);
}
}using (var transaction = _context.Database.BeginTransaction())
{
try
{
// 2. 创建订单
var order = new Order
{
UserId = _userManager.GetUserId(User),
OrderDate = DateTime.UtcNow,
Total = cart.GetTotal(),
ShippingAddress = model.ShippingAddress,
Status = OrderStatus.PendingPayment // 初始状态
};
_context.Orders.Add(order);
await _context.SaveChangesAsync(); // 获取OrderId// 3. 添加订单明细 & 扣减库存 foreach (var item in cart.Items) { var product = await _context.Products.FindAsync(item.ProductId); order.OrderDetails.Add(new OrderDetail { ProductId = item.ProductId, Quantity = item.Quantity, UnitPrice = product.Price }); product.StockQuantity -= item.Quantity; // 扣减库存 } // 4. 清空购物车 _context.CartItems.RemoveRange(cart.Items); await _context.SaveChangesAsync(); transaction.Commit(); // 提交事务 // 5. 调用支付网关 (如Stripe) // ... 支付集成代码 (通常涉及创建PaymentIntent、重定向到支付页面) return RedirectToAction("Payment", new { orderId = order.Id }); } catch (Exception ex) { transaction.Rollback(); _logger.LogError(ex, "订单创建失败"); ModelState.AddModelError("", "订单处理过程中发生错误,请重试或联系客服"); return View(model); } -
支付集成 (Stripe 示例): 使用官方
Stripe.netNuGet 包。 -
订单状态管理: 定义
OrderStatus枚举 (PendingPayment,Processing,Shipped,Delivered,Cancelled),通过后台任务或 Webhook 更新状态。
-
高级优化与最佳实践

-
性能优化:
- 缓存: 对频繁读取、变化少的数据(如分类菜单、热门产品)使用
IMemoryCache或 Redis。[ResponseCache]特性缓存视图输出。 - 异步编程: 广泛使用
async/await(如ToListAsync(),SaveChangesAsync()) 提高吞吐量和响应能力。 - EF Core 优化: 使用
AsNoTracking()查询只读数据;Select()投影仅需字段;避免 N+1 查询 (Include()/ThenInclude())。 - CDN: 静态资源(CSS, JS, 图片)托管到 CDN。
- 缓存: 对频繁读取、变化少的数据(如分类菜单、热门产品)使用
-
安全性加固:
- 输入验证: 模型属性使用
[Required],[StringLength],[Range]等数据注解;控制器方法使用ModelState.IsValid检查。 - 防跨站脚本 (XSS): Razor 视图默认自动编码输出 (
@product.Name),谨慎使用@Html.Raw()。 - 防跨站请求伪造 (CSRF): 表单必须包含
@Html.AntiForgeryToken(),Action 标记[ValidateAntiForgeryToken]。 - SQL 注入防护: 坚持使用 EF Core 参数化查询,避免 直接拼接 SQL 字符串。
- HTTPS 强制:
app.UseHttpsRedirection()。 - 敏感数据保护: 使用
IConfiguration和 Secret Manager 或 Azure Key Vault 存储连接字符串、API 密钥。[DataType(DataType.Password)]隐藏密码输入。
- 输入验证: 模型属性使用
-
可维护性与可测试性:
- 依赖注入 (DI): 将服务(如
IProductService,IOrderService)注册到容器 (services.AddScoped<...>()),在控制器构造函数注入。 - 清晰的层边界: 严格定义各层职责,通过接口解耦。
- 单元测试: 使用 xUnit/NUnit 和 Moq 测试业务逻辑层。
- 日志: 使用 ILogger 记录关键操作和异常。
- 依赖注入 (DI): 将服务(如
部署与扩展
- 部署目标: Azure App Service (最简), Docker 容器 (灵活), Kubernetes (大规模微服务)。
- 数据库: Azure SQL Database, SQL Server on VM, 或云托管 PostgreSQL/MySQL。
- 配置:
appsettings.json结合环境变量 (ASPNETCORE_ENVIRONMENT=Production)。 - CI/CD: Azure DevOps Pipelines, GitHub Actions 自动化构建、测试、部署。
- 扩展: 水平扩展应用服务器实例;数据库读写分离、分库分表;引入消息队列 (Azure Service Bus, RabbitMQ) 解耦耗时任务(如发送订单确认邮件)。
ASP.NET Core 提供了构建企业级电商网站所需的全套技术栈,通过分层架构、EF Core、Identity、缓存、事务、异步编程和安全措施,开发者能够创建高性能、安全可靠、易于维护的系统,深入理解核心功能(用户、产品、购物车、订单)的实现细节和最佳实践(性能、安全、架构)是成功的关键,持续关注 .NET 新版本特性和云服务集成,将使应用保持竞争力。
您在实际 ASP.NET Core 项目中遇到过哪些技术挑战?最希望深入了解哪个模块(如高级 Identity 定制、微服务拆分、具体支付集成细节)?欢迎在评论区分享您的经验和疑问!
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/20390.html