从 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 的依赖注入设计!

相关推荐
William_cl8 分钟前
C# ASP.NET Controller 核心:PartialViewResult 实战指南(AJAX 局部刷新全解析)
ajax·c#·asp.net
Victor35621 分钟前
Redis(137)Redis的模块机制是什么?
后端
Victor35624 分钟前
Redis(136)Redis的客户端缓存是如何实现的?
后端
不知更鸟5 小时前
Django 项目设置流程
后端·python·django
黄昏恋慕黎明7 小时前
spring MVC了解
java·后端·spring·mvc
G探险者9 小时前
为什么 VARCHAR(1000) 存不了 1000 个汉字? —— 详解主流数据库“字段长度”的底层差异
数据库·后端·mysql
百锦再9 小时前
第18章 高级特征
android·java·开发语言·后端·python·rust·django
Tony Bai9 小时前
Go 在 Web3 的统治力:2025 年架构与生态综述
开发语言·后端·架构·golang·web3
程序猿20239 小时前
项目结构深度解析:理解Spring Boot项目的标准布局和约定
java·spring boot·后端
RainbowSea10 小时前
内网穿透配置和使用
java·后端