第三章:ASP.NET Core MVC


文档摘要

第三章: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

第三章:ASP.NET Core MVC

ASP.NET Core MVC 是一个用于构建现代 Web 应用程序的强大框架。它实现了 Model-View-Controller (MVC) 设计模式,将应用程序划分为三个相互关联的部分,从而实现关注点分离,提高代码的可维护性和可测试性。

本章将深入探讨 ASP.NET Core MVC 的核心概念、组件以及实际应用,帮助您构建健壮且可扩展的 Web 应用程序。

3.1 MVC 模式概述

MVC 模式是一种软件架构模式,它将应用程序分为以下三个主要组件:

  • Model(模型): 表示应用程序的数据和业务逻辑。模型负责从数据库或其他数据源检索数据,并执行数据操作。

  • View(视图): 负责向用户呈现数据。视图通常是 HTML 模板,它使用模型中的数据来生成用户界面。

  • Controller(控制器): 充当模型和视图之间的中介。控制器接收用户的输入,更新模型,并选择要显示的视图。

graph TD A[用户] --> B(Controller) B --> C{Model} C --> D(数据库/数据源) C --> B B --> E[View] E --> A

MVC 模式的优点:

  • 关注点分离: 将应用程序划分为独立的组件,使代码更易于理解、维护和测试。

  • 可重用性: 模型和视图可以在不同的应用程序中重用。

  • 可测试性: 可以独立测试模型、视图和控制器。

  • 并行开发: 不同的开发人员可以同时处理模型、视图和控制器。

3.2 ASP.NET Core 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: 过滤器允许您在请求处理管道中插入自定义逻辑,例如身份验证、授权、异常处理等。

3.3 创建第一个 ASP.NET Core MVC 应用程序

让我们创建一个简单的 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.cshtmlDetails.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 文件中,配置路由以将请求映射到 ProductControllerIndex 操作。

// 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。您应该看到产品列表。单击产品名称将导航到该产品的详细信息页面。

3.4 控制器详解

控制器是 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) { // ... } }

3.5 视图详解

视图负责向用户呈现数据。在 ASP.NET Core MVC 中,视图通常是 Razor 视图文件(.cshtml),它使用 C# 代码嵌入到 HTML 中,以动态生成用户界面。

Razor 语法:

Razor 语法允许您在 HTML 中嵌入 C# 代码,以便动态生成内容。

  • @ 符号用于标记 C# 代码块。

  • @Model 用于访问传递给视图的模型。

  • @Html 帮助程序类提供了一系列用于生成 HTML 元素的辅助方法。

  • @Url 帮助程序类提供了一系列用于生成 URL 的辅助方法。

  • @await Html.PartialAsync() 用于渲染局部视图。

ViewBag 和 ViewData:

ViewBagViewData 是用于将数据从控制器传递到视图的动态属性。它们是 dynamicViewDataDictionary 类型的属性,可以在控制器中设置并在视图中访问。

// 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 视图。

3.6 模型绑定和验证

模型绑定是将 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 可以自动生成客户端验证脚本,以便在客户端验证模型数据,从而提高用户体验。

3.7 过滤器

过滤器允许您在请求处理管道中插入自定义逻辑,例如身份验证、授权、异常处理等。

过滤器类型:

  • 授权过滤器: 用于验证用户是否有权访问特定的资源。

  • 资源过滤器: 在请求处理管道的早期阶段执行,可以用于缓存响应或执行其他资源管理任务。

  • 操作过滤器: 在操作方法执行之前和之后执行,可以用于记录日志、验证输入或修改操作结果。

  • 异常过滤器: 用于处理应用程序中的异常。

  • 结果过滤器: 在操作结果执行之前和之后执行,可以用于修改响应或执行其他结果处理任务。

示例:自定义操作过滤器

// 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)); }); }

3.8 总结

本章介绍了 ASP.NET Core MVC 的核心概念、组件以及实际应用。通过学习本章,您应该能够理解 MVC 模式的优势,并能够创建简单的 ASP.NET Core MVC 应用程序。

ASP.NET Core MVC 是一个功能强大的框架,可以帮助您构建现代、可维护和可测试的 Web 应用程序。 在后续章节中,我们将继续深入探讨 ASP.NET Core MVC 的高级特性,例如依赖注入、身份验证、授权和测试。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U