从 MVC 5 到 Core MVC:ASP.NET MVC 框架的 “进化之路“

目录

    • [引言:为什么要聊 MVC 的版本演进?](#引言:为什么要聊 MVC 的版本演进?)
    • [一、MVC 5:Windows 平台的 "老伙计"(2013-2016)](#一、MVC 5:Windows 平台的 "老伙计"(2013-2016))
      • [1.1 MVC 5 的核心特性(列表)](#1.1 MVC 5 的核心特性(列表))
      • [1.2 代码示例:MVC 5 的控制器与路由](#1.2 代码示例:MVC 5 的控制器与路由)
      • [1.3 小节:MVC 5 就像 "固定电话"------ 功能稳定但场景受限,只能在 Windows 环境下工作,配置方式偏传统,依赖第三方工具扩展能力。](#1.3 小节:MVC 5 就像 "固定电话"—— 功能稳定但场景受限,只能在 Windows 环境下工作,配置方式偏传统,依赖第三方工具扩展能力。)
    • [二、Core MVC:跨平台的 "新势力"(2016 至今)](#二、Core MVC:跨平台的 "新势力"(2016 至今))
      • [2.1 Core MVC 的核心突破(列表)](#2.1 Core MVC 的核心突破(列表))
      • [2.2 代码示例:Core MVC 的控制器与配置](#2.2 代码示例:Core MVC 的控制器与配置)
      • [2.3 小节:Core MVC 就像 "智能手机"------ 跨平台、模块化、性能强,原生支持现代开发需求(如依赖注入、环境配置),彻底摆脱了对 Windows 和 IIS 的依赖。](#2.3 小节:Core MVC 就像 "智能手机"—— 跨平台、模块化、性能强,原生支持现代开发需求(如依赖注入、环境配置),彻底摆脱了对 Windows 和 IIS 的依赖。)
    • [三、MVC 5 vs Core MVC:关键差异对比(附流程图)](#三、MVC 5 vs Core MVC:关键差异对比(附流程图))
      • [3.1 核心差异列表](#3.1 核心差异列表)
      • [3.2 版本演进流程图](#3.2 版本演进流程图)
    • [四、从 MVC 5 迁移到 Core MVC:常踩的坑及解决](#四、从 MVC 5 迁移到 Core MVC:常踩的坑及解决)
      • [4.1 坑 1:HttpContext.Current用不了了!](#4.1 坑 1:HttpContext.Current用不了了!)
      • [4.2 坑 2:Web.config配置失效](#4.2 坑 2:Web.config配置失效)
      • [4.3 坑 3:Linux 部署后静态文件(CSS/JS)加载失败](#4.3 坑 3:Linux 部署后静态文件(CSS/JS)加载失败)
      • [4.4 小节:迁移时的坑多源于 "思维惯性"------ 用 MVC 5 的写法套 Core MVC,忽略了跨平台特性和设计理念的变化。记住:Core MVC 更强调 "依赖注入" 和 "配置灵活性"。](#4.4 小节:迁移时的坑多源于 "思维惯性"—— 用 MVC 5 的写法套 Core MVC,忽略了跨平台特性和设计理念的变化。记住:Core MVC 更强调 "依赖注入" 和 "配置灵活性"。)
    • [五、总结:该选 MVC 5 还是 Core MVC?](#五、总结:该选 MVC 5 还是 Core MVC?)

引言:为什么要聊 MVC 的版本演进?

如果你是ASP.NET开发者,一定经历过这样的场景:刚上手时对着 MVC 5 的Global.asax一脸懵,后来接触 Core MVC 又被Startup.cs和依赖注入绕晕。其实,MVC 框架的演进就像手机系统升级 ------ 从功能单一的 "功能机"(MVC 5)到支持多场景的 "智能机"(Core MVC),每一步都藏着开发者的需求变化。

今天这篇专栏,我们就用代码说话、用踩坑经验避坑,带你搞懂 MVC 5 到 Core MVC 的核心变化,看完就能明白:为什么现在主流项目都选 Core MVC?

一、MVC 5:Windows 平台的 "老伙计"(2013-2016)

MVC 5 作为经典版本,曾是.NET 开发者的 "标配"。它基于.NET Framework,就像一台只能在 Windows 系统上运行的老式打印机 ------ 稳定,但不够灵活。

1.1 MVC 5 的核心特性(列表)

  • 依赖 IIS 服务器,只能跑在 Windows 上
  • 配置集中在Global.asax和Web.config
  • 依赖注入需要第三方库(如 Autofac)
  • 视图引擎默认是 Razor,支持 Web Forms 视图引擎
  • 路由配置通过RouteConfig.cs静态注册

1.2 代码示例:MVC 5 的控制器与路由

控制器(Controller)

csharp 复制代码
// 传统MVC 5控制器
public class HomeController : Controller
{
    // 访问路径:/Home/Index
    public ActionResult Index()
    {
        ViewBag.Message = "Hello MVC 5";
        return View();
    }
}

路由配置(RouteConfig.cs)

csharp 复制代码
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        
        // 传统路由:固定格式{controller}/{action}/{id}
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

启动配置(Global.asax)

csharp 复制代码
public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes); // 注册路由
        // 其他配置(过滤器、模型验证等)
    }
}

1.3 小节:MVC 5 就像 "固定电话"------ 功能稳定但场景受限,只能在 Windows 环境下工作,配置方式偏传统,依赖第三方工具扩展能力。

二、Core MVC:跨平台的 "新势力"(2016 至今)

2016 年.NET Core 1.0 发布,Core MVC 作为其中的 Web 框架,彻底打破了 "只能在 Windows 运行" 的枷锁。它就像一台笔记本电脑 ------ 既能在 Windows 办公,也能在 Mac 写代码,还能在 Linux 服务器上跑服务。

2.1 Core MVC 的核心突破(列表)

  • 跨平台:支持 Windows、macOS、Linux
  • 模块化:通过 NuGet 包按需引用(不再捆绑所有功能)
  • 内置依赖注入:无需第三方库,原生支持
  • 统一配置:用appsettings.json替代Web.config,支持环境变量
  • 灵活部署:可自托管(无需 IIS),也可搭配 Nginx/Apache
  • 性能提升:比 MVC 5 快 2-5 倍(微软官方测试数据)

2.2 代码示例:Core MVC 的控制器与配置

控制器(Controller)

csharp 复制代码
// Core MVC控制器(简化后)
public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    
    // 依赖注入:原生支持,无需第三方库
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }
    
    // 访问路径:/Home/Index
    public IActionResult Index()
    {
        ViewData["Message"] = "Hello Core MVC";
        return View();
    }
}

路由与启动配置(Program.cs + Startup.cs)

csharp 复制代码
// Program.cs(.NET 6+简化写法)
var builder = WebApplication.CreateBuilder(args);

// 添加MVC服务(模块化:按需添加)
builder.Services.AddControllersWithViews();

var app = builder.Build();

// 配置HTTP请求管道
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting(); // 启用路由
app.UseAuthorization();

// 路由配置:支持传统路由和特性路由
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run(); // 启动应用(自托管能力)

2.3 小节:Core MVC 就像 "智能手机"------ 跨平台、模块化、性能强,原生支持现代开发需求(如依赖注入、环境配置),彻底摆脱了对 Windows 和 IIS 的依赖。

三、MVC 5 vs Core MVC:关键差异对比(附流程图)

为了更直观理解,我们用 "快递系统" 类比:

  • MVC 5:只能用 "顺丰陆运"(Windows+IIS),打包必须用指定纸箱(Web.config),想加保温层(扩展功能)得找第三方
  • Core MVC:支持 "顺丰、京东、三通一达"(多平台),打包用可拼接的箱子(模块化配置),自带保温层(内置依赖注入)

3.1 核心差异列表

特性 MVC 5 Core MVC
运行环境 仅 Windows(依赖.NET Framework) 跨平台(依赖.NET Core/.NET 5+)
配置文件 Web.config(XML 格式) appsettings.json(JSON 格式)
依赖注入 需第三方库(如 Autofac) 原生内置
部署方式 依赖 IIS 自托管 / 搭配 Nginx/Apache/IIS
启动入口 Global.asax Program.cs
性能 中等 高 (比 MVC 5 快 2-5 倍)

3.2 版本演进流程图

plaintext 复制代码
2009年:ASP.NET MVC 1.0发布(基于.NET Framework)
→ 2013年:MVC 5发布(经典版本,广泛应用)
→ 2016年:.NET Core 1.0发布(含Core MVC,跨平台起步)
→ 2017-2019年:.NET Core 2.x/3.x迭代(完善Core MVC功能)
→ 2020年:.NET 5发布(统一Core和Framework,Core MVC成为主流)
→ 2021-2025年:.NET 6/7/8迭代(Core MVC持续优化,性能再提升)

四、从 MVC 5 迁移到 Core MVC:常踩的坑及解决

就像从 "功能机" 换 "智能机" 会不习惯,迁移过程中这些坑一定要避开:

4.1 坑 1:HttpContext.Current用不了了!

问题: MVC 5 中常用HttpContext.Current获取上下文,Core MVC 中直接移除了这个静态属性。
原因: Core MVC 是多线程安全设计,静态属性会导致线程冲突。
解决: 通过依赖注入IHttpContextAccessor获取上下文:

csharp 复制代码
// 在Program.cs中注册服务
builder.Services.AddHttpContextAccessor();

// 在控制器中使用
public class HomeController : Controller
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    
    public HomeController(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }
    
    public IActionResult Index()
    {
        var context = _httpContextAccessor.HttpContext; // 获取上下文
        return View();
    }
}

4.2 坑 2:Web.config配置失效

问题: 迁移时把Web.config的数据库连接字符串直接复制到appsettings.json,发现读不到。
原因: JSON 格式和 XML 格式语法不同,且 Core 用IConfiguration读取配置。
解决: 正确配置appsettings.json并通过IConfiguration读取:

json 复制代码
// appsettings.json
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=.;Database=Test;Trusted_Connection=True"
  }
}
csharp 复制代码
// 读取配置
public class HomeController : Controller
{
    private readonly string _connStr;
    
    public HomeController(IConfiguration config)
    {
        _connStr = config.GetConnectionString("DefaultConnection");
    }
}

4.3 坑 3:Linux 部署后静态文件(CSS/JS)加载失败

问题: Core MVC 在 Windows 运行正常,部署到 Linux 后静态文件 404。
原因: Linux 区分文件名大小写,而 Windows 不区分(如Style.css和style.css在 Linux 是两个文件)。
解决: 统一静态文件命名(全小写),并确保UseStaticFiles()中间件已启用:

csharp 复制代码
// Program.cs中必须添加
app.UseStaticFiles(); // 启用静态文件访问

4.4 小节:迁移时的坑多源于 "思维惯性"------ 用 MVC 5 的写法套 Core MVC,忽略了跨平台特性和设计理念的变化。记住:Core MVC 更强调 "依赖注入" 和 "配置灵活性"。

五、总结:该选 MVC 5 还是 Core MVC?

  • 选 MVC 5:仅维护旧系统,且团队对 Core 不熟悉
  • 选 Core MVC:新项目、需要跨平台部署、追求高性能、想接入云原生(Docker/K8s)
    一句话:Core MVC 是未来趋势,除非有特殊历史包袱,否则优先选它。

如果这篇文章帮你理清了 MVC 框架的演进,别忘了点赞 + 收藏~ 关注我,下期带你深入 Core MVC 的依赖注入设计!

相关推荐
低音钢琴6 小时前
【SpringBoot从初学者到专家的成长25】认识SpringBoot中的Spring Expression Language (SpEL)
spring boot·后端·spring·spel
绝无仅有6 小时前
某游戏大厂Java面试深度解析:从多线程到JVM调优(二)
后端·面试·github
绝无仅有6 小时前
某游戏大厂Java面试指南:Spring、集合与语言特性深度解析 (三)
后端·面试·github
程序新视界6 小时前
数据库的分片与分区:有什么区别?
数据库·后端·mysql
IT_陈寒6 小时前
Java 17 新特性实战:这5个隐藏功能让你的代码效率提升50%
前端·人工智能·后端
程序员爱钓鱼6 小时前
Python编程实战 - 函数与模块化编程 - 创建自己的模块与包
后端
程序员爱钓鱼6 小时前
Python编程实战 - 函数与模块化编程 - Python内置模块(math、os、sys、random等)
后端·python·ipython
Victor3566 小时前
Redis(94)如何启用Redis的数据加密?
后端
Victor3566 小时前
Redis(95)Redis的防火墙配置如何设置?
后端