第三章:ASP.NET Core MVC 第三章:ASP.NET Core MVC ASP.NET Core MVC 是一个用于构建现代 Web 应用程序的强大框架。它实现了 Model-View-Controller (MVC) 设计模式,将应用程序划分为三个相互关联的部分,从而实现关注点分离,提高代码的可维护性和可测试性。 本章将深入探讨 ASP.NET Core MVC 的核心概念、组件以及实际应用,帮助您构建健壮且可扩展的 Web 应用程序。 3.1 MVC 模式概述 MVC 模式是一种软件架构模式,它将应用程序分为以下三个主要组件: Model(模型): 表示应用程序的数据和业务逻辑。模型负责从数据库或其他数据源检索数据,并执行数据操作。 View(视图): 负责向用户呈现数据。
ASP.NET Core MVC 是一个用于构建现代 Web 应用程序的强大框架。它实现了 Model-View-Controller (MVC) 设计模式,将应用程序划分为三个相互关联的部分,从而实现关注点分离,提高代码的可维护性和可测试性。
本章将深入探讨 ASP.NET Core MVC 的核心概念、组件以及实际应用,帮助您构建健壮且可扩展的 Web 应用程序。
MVC 模式是一种软件架构模式,它将应用程序分为以下三个主要组件:
Model(模型): 表示应用程序的数据和业务逻辑。模型负责从数据库或其他数据源检索数据,并执行数据操作。
View(视图): 负责向用户呈现数据。视图通常是 HTML 模板,它使用模型中的数据来生成用户界面。
Controller(控制器): 充当模型和视图之间的中介。控制器接收用户的输入,更新模型,并选择要显示的视图。
MVC 模式的优点:
关注点分离: 将应用程序划分为独立的组件,使代码更易于理解、维护和测试。
可重用性: 模型和视图可以在不同的应用程序中重用。
可测试性: 可以独立测试模型、视图和控制器。
并行开发: 不同的开发人员可以同时处理模型、视图和控制器。
ASP.NET Core MVC 建立在 ASP.NET Core 框架之上,利用其依赖注入、中间件管道和跨平台支持等功能。
核心组件:
Controllers: Controller 类是 MVC 应用程序的核心。它们处理传入的 HTTP 请求,与模型交互,并返回视图或执行其他操作(例如重定向)。
Views: 视图通常是 Razor 视图文件(.cshtml),它使用 C# 代码嵌入到 HTML 中,以动态生成用户界面。
Models: 模型是表示应用程序数据的类。它们可以包含数据验证规则和业务逻辑。
Routing: 路由系统将传入的 HTTP 请求映射到特定的控制器操作。
Model Binding: 模型绑定将 HTTP 请求中的数据(例如表单数据、查询字符串参数)自动转换为模型对象。
View Engines: 视图引擎负责解析视图文件并生成 HTML 输出。Razor 视图引擎是 ASP.NET Core MVC 的默认视图引擎。
Filters: 过滤器允许您在请求处理管道中插入自定义逻辑,例如身份验证、授权、异常处理等。
让我们创建一个简单的 ASP.NET Core MVC 应用程序,演示如何使用 MVC 模式显示数据。
步骤 1:创建项目
使用 .NET CLI 或 Visual Studio 创建一个新的 ASP.NET Core Web 应用程序项目,选择 "Web App (Model-View-Controller)" 模板。
dotnet new mvc -n MyWebApp cd MyWebApp
步骤 2:定义模型
创建一个名为 Models 的文件夹,并在其中创建一个名为 Product.cs 的类,用于表示产品信息。
// Models/Product.cs namespace MyWebApp.Models { public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string Description { get; set; } } }
步骤 3:创建控制器
在 Controllers 文件夹中创建一个名为 ProductController.cs 的类,用于处理产品相关的请求。
// Controllers/ProductController.cs using Microsoft.AspNetCore.Mvc; using MyWebApp.Models; using System.Collections.Generic; namespace MyWebApp.Controllers { public class ProductController : Controller { public IActionResult Index() { // 创建一些示例产品数据 var products = new List<Product> { new Product { Id = 1, Name = "Laptop", Price = 1200.00M, Description = "High-performance laptop" }, new Product { Id = 2, Name = "Mouse", Price = 25.00M, Description = "Wireless mouse" }, new Product { Id = 3, Name = "Keyboard", Price = 75.00M, Description = "Mechanical keyboard" } }; // 将产品数据传递给视图 return View(products); } public IActionResult Details(int id) { // 创建一些示例产品数据 var products = new List<Product> { new Product { Id = 1, Name = "Laptop", Price = 1200.00M, Description = "High-performance laptop" }, new Product { Id = 2, Name = "Mouse", Price = 25.00M, Description = "Wireless mouse" }, new Product { Id = 3, Name = "Keyboard", Price = 75.00M, Description = "Mechanical keyboard" } }; var product = products.Find(p => p.Id == id); if (product == null) { return NotFound(); } return View(product); } } }
步骤 4:创建视图
在 Views/Product 文件夹中创建两个视图文件:Index.cshtml 和 Details.cshtml。
Index.cshtml 用于显示产品列表。
@model List<MyWebApp.Models.Product> <h2>Product List</h2> <ul> @foreach (var product in Model) { <li> <a asp-action="Details" asp-route-id="@product.Id">@product.Name</a> - $@product.Price </li> } </ul>
Details.cshtml 用于显示单个产品的详细信息。
@model MyWebApp.Models.Product <h2>Product Details</h2> <div> <h3>@Model.Name</h3> <p>Price: $@Model.Price</p> <p>Description: @Model.Description</p> </div> <a asp-action="Index">Back to List</a>
步骤 5:配置路由
在 Startup.cs 文件中,配置路由以将请求映射到 ProductController 的 Index 操作。
// Startup.cs public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // ... 其他配置 app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
步骤 6:运行应用程序
运行应用程序,并在浏览器中访问 /Product URL。您应该看到产品列表。单击产品名称将导航到该产品的详细信息页面。
控制器是 MVC 应用程序的核心组件,负责处理用户输入、更新模型和选择要显示的视图。
控制器操作:
控制器操作是控制器类中的公共方法,用于处理特定的 HTTP 请求。操作方法通常返回 IActionResult 类型,它可以是以下几种类型之一:
ViewResult:返回一个视图。
RedirectResult:重定向到另一个 URL。
JsonResult:返回 JSON 数据。
ContentResult:返回文本内容。
FileResult:返回文件。
NotFoundResult:返回 404 Not Found 错误。
StatusCodeResult:返回自定义状态码。
操作方法参数:
操作方法可以接收参数,这些参数通常来自 HTTP 请求中的数据,例如查询字符串参数、表单数据或路由参数。ASP.NET Core MVC 使用模型绑定将这些数据自动转换为操作方法参数。
属性路由:
除了传统的基于约定的路由外,ASP.NET Core MVC 还支持属性路由,它允许您使用 [Route] 属性在控制器和操作方法上定义路由。
[Route("products")] public class ProductController : Controller { [Route("")] // /products [Route("index")] // /products/index public IActionResult Index() { // ... } [Route("details/{id:int}")] // /products/details/123 public IActionResult Details(int id) { // ... } }
视图负责向用户呈现数据。在 ASP.NET Core MVC 中,视图通常是 Razor 视图文件(.cshtml),它使用 C# 代码嵌入到 HTML 中,以动态生成用户界面。
Razor 语法:
Razor 语法允许您在 HTML 中嵌入 C# 代码,以便动态生成内容。
@ 符号用于标记 C# 代码块。
@Model 用于访问传递给视图的模型。
@Html 帮助程序类提供了一系列用于生成 HTML 元素的辅助方法。
@Url 帮助程序类提供了一系列用于生成 URL 的辅助方法。
@await Html.PartialAsync() 用于渲染局部视图。
ViewBag 和 ViewData:
ViewBag 和 ViewData 是用于将数据从控制器传递到视图的动态属性。它们是 dynamic 和 ViewDataDictionary 类型的属性,可以在控制器中设置并在视图中访问。
// Controller public IActionResult Index() { ViewBag.Message = "Hello from the controller!"; ViewData["CurrentTime"] = DateTime.Now.ToString(); return View(); } // View <h2>@ViewBag.Message</h2> <p>Current Time: @ViewData["CurrentTime"]</p>
Layout 视图:
Layout 视图是用于定义应用程序的通用布局的模板。它可以包含页眉、页脚、导航栏等元素。您可以使用 _ViewStart.cshtml 文件指定应用程序的默认 Layout 视图。
模型绑定是将 HTTP 请求中的数据自动转换为模型对象的过程。ASP.NET Core MVC 提供了强大的模型绑定功能,可以自动处理各种数据类型和格式。
数据注解:
数据注解是用于指定模型属性的验证规则的属性。ASP.NET Core MVC 使用数据注解来自动验证模型数据。
// Models/Product.cs using System.ComponentModel.DataAnnotations; namespace MyWebApp.Models { public class Product { public int Id { get; set; } [Required(ErrorMessage = "Name is required")] [StringLength(50, MinimumLength = 3, ErrorMessage = "Name must be between 3 and 50 characters")] public string Name { get; set; } [Range(0.01, 10000.00, ErrorMessage = "Price must be between 0.01 and 10000.00")] public decimal Price { get; set; } public string Description { get; set; } } }
客户端验证:
ASP.NET Core MVC 可以自动生成客户端验证脚本,以便在客户端验证模型数据,从而提高用户体验。
过滤器允许您在请求处理管道中插入自定义逻辑,例如身份验证、授权、异常处理等。
过滤器类型:
授权过滤器: 用于验证用户是否有权访问特定的资源。
资源过滤器: 在请求处理管道的早期阶段执行,可以用于缓存响应或执行其他资源管理任务。
操作过滤器: 在操作方法执行之前和之后执行,可以用于记录日志、验证输入或修改操作结果。
异常过滤器: 用于处理应用程序中的异常。
结果过滤器: 在操作结果执行之前和之后执行,可以用于修改响应或执行其他结果处理任务。
示例:自定义操作过滤器
// Filters/LogActionFilter.cs using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Logging; namespace MyWebApp.Filters { public class LogActionFilter : IActionFilter { private readonly ILogger<LogActionFilter> _logger; public LogActionFilter(ILogger<LogActionFilter> logger) { _logger = logger; } public void OnActionExecuting(ActionExecutingContext context) { _logger.LogInformation($"Action {context.ActionDescriptor.DisplayName} is executing."); } public void OnActionExecuted(ActionExecutedContext context) { _logger.LogInformation($"Action {context.ActionDescriptor.DisplayName} executed."); } } }
将过滤器添加到控制器或操作方法:
[ServiceFilter(typeof(LogActionFilter))] public class ProductController : Controller { // ... }
或者,全局注册过滤器:
// Startup.cs public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(options => { options.Filters.Add(typeof(LogActionFilter)); }); }
本章介绍了 ASP.NET Core MVC 的核心概念、组件以及实际应用。通过学习本章,您应该能够理解 MVC 模式的优势,并能够创建简单的 ASP.NET Core MVC 应用程序。
ASP.NET Core MVC 是一个功能强大的框架,可以帮助您构建现代、可维护和可测试的 Web 应用程序。 在后续章节中,我们将继续深入探讨 ASP.NET Core MVC 的高级特性,例如依赖注入、身份验证、授权和测试。