10.1 MVC模式简介
1. MVC模式概述
MVC(Model-View-Controller)是一种广泛使用的软件架构模式,它将应用程序分为三个核心组件:
- Model(模型):负责数据和业务逻辑
- View(视图):负责用户界面展示
- Controller(控制器):处理用户输入并协调模型和视图
graph TD
A[用户请求] --> B[Controller]
B --> C[Model]
C --> D[View]
D --> E[用户响应]
2. ASP.NET Core中的MVC实现
在ASP.NET Core中,MVC模式通过以下方式实现:
2.1 模型(Model)
- 代表应用程序的数据和业务规则
- 通常包含POCO(Plain Old CLR Objects)类
- 可以包含数据验证逻辑
public class Product
{
public int Id { get; set; }
[Required]
[StringLength(100)]
public string Name { get; set; }
[Range(0, 999.99)]
public decimal Price { get; set; }
}
2.2 视图(View)
- 使用Razor语法(.cshtml文件)
- 负责呈现用户界面
- 支持布局(Layout)和部分视图(Partial View)
@model IEnumerable<Product>
<h2>Product List</h2>
<table>
@foreach(var product in Model)
{
<tr>
<td>@product.Name</td>
<td>@product.Price.ToString("C")</td>
</tr>
}
</table>
2.3 控制器(Controller)
- 处理HTTP请求
- 返回IActionResult(视图、JSON、重定向等)
- 遵循"约定优于配置"原则
public class ProductsController : Controller
{
private readonly IProductRepository _repository;
public ProductsController(IProductRepository repository)
{
_repository = repository;
}
public IActionResult Index()
{
var products = _repository.GetAll();
return View(products);
}
}
3. MVC请求生命周期
- 路由系统接收HTTP请求
- 根据路由规则匹配控制器和动作方法
- 执行控制器方法
- 控制器与模型交互
- 控制器选择并返回视图
- 视图引擎渲染视图
- 返回HTML响应给客户端
4. MVC的优势
| 优势 | 说明 |
|---|---|
| 关注点分离 | 各组件职责明确,便于维护 |
| 可测试性 | 组件独立,便于单元测试 |
| 可扩展性 | 可以灵活替换视图或控制器 |
| 并行开发 | 团队可以同时开发不同组件 |
5. 在ASP.NET Core中配置MVC
在Startup.cs中配置MVC服务:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(); // 添加MVC服务
}
public void Configure(IApplicationBuilder app)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
6. 现代MVC的变体
- MVVM(Model-View-ViewModel):常用于客户端框架
- Razor Pages:ASP.NET Core的简化MVC模型
- Blazor:使用WebAssembly的组件模型
7. 最佳实践
- 保持控制器精简("瘦控制器"原则)
- 将业务逻辑放在模型或服务层
- 使用强类型视图
- 合理使用视图组件和部分视图
- 遵循RESTful设计原则
8. 常见问题解答
Q:MVC适合所有类型的Web应用吗? A:虽然MVC非常通用,但对于简单的CRUD应用,Razor Pages可能是更简单的选择;对于高度交互的应用,可能需要结合前端框架。
Q:如何处理复杂的视图逻辑? A:可以使用视图组件(View Components)或将复杂逻辑移到视图模型(View Model)中。
Q:MVC与Web API有何区别? A:Web API是MVC的子集,专注于返回数据而非HTML视图,但两者可以共存于同一项目中。
