目录
- 
- [引言:为什么要聊 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 的依赖注入设计!