问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ASP.NET Core MVC框架全面解析

创作时间:
作者:
@小白创作中心

ASP.NET Core MVC框架全面解析

引用
1
来源
1.
https://learn.microsoft.com/zh-cn/aspnet/core/mvc/overview?view=aspnetcore-9.0

ASP.NET Core MVC是微软推出的一个基于模型-视图-控制器(MVC)设计模式的Web应用开发框架。它结合了轻量级、开源和高度可测试的特点,特别适合构建现代Web应用和API。本文将详细介绍ASP.NET Core MVC的核心概念和主要功能。

MVC模式

模型-视图-控制器(MVC)是一种架构模式,将应用程序分为三个主要组件:模型、视图和控制器。这种设计有助于实现关注点分离,使代码更易于维护和测试。

  • 模型(Model):负责处理应用程序的数据和业务逻辑。
  • 视图(View):负责展示数据,通常使用Razor视图引擎来生成HTML。
  • 控制器(Controller):处理用户交互,调用模型进行数据处理,并选择合适的视图进行展示。

ASP.NET Core MVC框架

ASP.NET Core MVC是一个轻量级、开源、高度可测试的框架,特别适合构建现代Web应用和API。它提供了以下主要特性:

  • 路由(Routing):支持基于约定的路由和属性路由,可以灵活地定义URL映射规则。
  • 模型绑定(Model Binding):自动将请求数据绑定到控制器方法的参数。
  • 模型验证(Model Validation):支持客户端和服务器端的验证,确保数据的有效性。
  • 依赖注入(Dependency Injection):内置对DI的支持,使代码更易于测试和维护。
  • 筛选器(Filters):用于封装横切关注点,如异常处理和授权。
  • 区域(Areas):支持将大型应用划分为更小的功能模块。
  • Web API支持:提供了对RESTful API开发的全面支持。
  • 测试性(Testability):框架设计充分考虑了单元测试和集成测试的需求。
  • Razor视图引擎:提供了一个强大且灵活的模板引擎,用于生成HTML内容。
  • 标记帮助程序(Tag Helpers):使服务器端代码能够参与HTML元素的创建和呈现。
  • 视图组件(View Components):用于封装和重用呈现逻辑。

核心概念详解

路由

ASP.NET Core MVC基于强大的路由系统,可以轻松定义SEO友好的URL结构。支持两种路由方式:

  • 基于约定的路由

    routes.MapRoute(name: "Default", template: "{controller=Home}/{action=Index}/{id?}");
    
  • 属性路由

    [Route("api/[controller]")]
    public class ProductsController : Controller
    {
        [HttpGet("{id}")]
        public IActionResult GetProduct(int id)
        {
            ...
        }
    }
    

模型绑定

模型绑定将请求数据(如表单值、路由数据、查询字符串等)自动转换为控制器可以处理的对象。例如:

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ... }

模型验证

通过在模型类上添加数据注释验证属性,可以在客户端和服务器端进行数据验证:

using System.ComponentModel.DataAnnotations;
public class LoginViewModel
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }
    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

依赖注入

控制器可以通过构造函数注入所需的服务:

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }
}

筛选器

筛选器用于封装横切关注点,如授权和异常处理:

[Authorize]
public class AccountController : Controller
{
    ...
}

区域

区域(Areas)将大型应用划分为更小的功能模块:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews()
            .AddRazorPagesOptions(options =>
            {
                options.Conventions.AddAreaPageRoute("Identity", "/Account/Login", "login");
            });
    }
}

Web API

支持生成RESTful API,并提供内容协商、CORS支持等功能:

[ApiController]
[Route("[controller]")]
public class ProductsController : ControllerBase
{
    [HttpGet]
    public IEnumerable<Product> Get()
    {
        return _productService.GetAllProducts();
    }
}

测试性

框架设计充分考虑了测试性,支持单元测试和集成测试:

public class HomeControllerTests
{
    [Fact]
    public async Task Index_ReturnsViewResult_WithCorrectModel()
    {
        // Arrange
        var mockRepository = new Mock<IProductRepository>();
        mockRepository.Setup(repo => repo.GetAllProducts()).Returns(new List<Product>());

        var controller = new HomeController(mockRepository.Object);

        // Act
        var result = await controller.Index();

        // Assert
        var viewResult = Assert.IsType<ViewResult>(result);
        var model = Assert.IsAssignableFrom<IEnumerable<Product>>(viewResult.Model);
        Assert.NotNull(model);
    }
}

Razor视图引擎

Razor视图引擎允许在HTML中嵌入C#代码:

<ul>
    @for (int i = 0; i < 5; i++)
    {
        <li>List item @i</li>
    }
</ul>

强类型视图

可以基于模型强类型化Razor视图:

@model IEnumerable<Product>
<ul>
    @foreach (Product p in Model)
    {
        <li>@p.Name</li>
    }
</ul>

标记帮助程序

标记帮助程序使服务器端代码能够参与HTML元素的创建和呈现:

<p>
    Thank you for confirming your email.
    Please <a asp-controller="Account" asp-action="Login">Click here to Log in</a>.
</p>

视图组件

视图组件用于封装和重用呈现逻辑:

public class WeatherForecastViewComponent : ViewComponent
{
    private readonly IWeatherForecastService _weatherForecastService;

    public WeatherForecastViewComponent(IWeatherForecastService weatherForecastService)
    {
        _weatherForecastService = weatherForecastService;
    }

    public async Task<IViewComponentResult> InvokeAsync()
    {
        var forecasts = await _weatherForecastService.GetForecastAsync();
        return View(forecasts);
    }
}

兼容性版本

SetCompatibilityVersion方法允许应用选择加入或退出ASP.NET Core MVC 2.1或更高版本中引入的潜在中断行为变更。有关详细信息,请参阅ASP.NET Core MVC的兼容性版本

其他资源

  • MyTested.AspNetCore.Mvc - ASP.NET Core MVC的Fluent测试库:强类型单元测试库,提供用于测试MVC和Web API应用的Fluent界面。(不由Microsoft进行支持或维护。)
  • ASP.NET Core中的依赖注入

本文详细介绍了ASP.NET Core MVC的核心概念和主要功能,希望对你的Web开发之旅有所帮助。如果你有任何问题或建议,欢迎在评论区留言。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号