深入浅出 C# MVC:从基础实践到避坑指南(附完整代码示例)

作者:William_cl日期:2025/10/12

目录

    • 1. 引言:C# MVC 为何仍是企业级开发的优选?
    • 2. C# MVC 核心知识树(附可视化图谱)
    • 3. 实战上手:从零搭建学生管理系统(完整代码)
      • 3.1 第一步:创建 MVC 项目
        • 3.2 Model 层:定义数据实体与验证规则
        • 3.3 Controller 层:处理请求与业务逻辑
        • 3.4 View 层:渲染页面与用户交互
          • 3.4.1 列表页(Index.cshtml)
            * 3.4.2 添加表单页(Create.cshtml)
        • 3.5 运行效果
    • 4. 开发必避:5 个高频 “坑点” 及解决方案
      • 4.1 坑点 1:路由配置冲突导致 404
        • 4.2 坑点 2:忽略 ModelState 验证导致脏数据
        • 4.3 坑点 3:ViewModel 滥用导致 View 逻辑混乱
        • 4.4 坑点 4:Action 返回类型错误导致前端异常
        • 4.5 坑点 5:过滤器执行顺序错误导致权限失效
    • 5. 互动交流:邀你一起深化 MVC 技能
    • 6. 结语:MVC 的进阶之路

1. 引言:C# MVC 为何仍是企业级开发的优选?

在ASP.NET Core 普及的今天,C# MVC(基于.NET Framework)依然是众多企业 legacy 项目的核心技术栈 —— 它的分层思想(Model-View-Controller)、低耦合架构和成熟的生态,不仅能降低团队协作成本,还能无缝对接 ORM 框架(如 Entity Framework)、权限系统(如ASP.NET Identity)等工具。

无论是维护现有项目,还是理解.NET 生态的分层设计思想,掌握 C# MVC 都是开发者的重要技能。本文将从「知识框架→实战代码→避坑指南」三个维度,带你系统掌握 C# MVC,并通过互动环节深化学习效果。

2. C# MVC 核心知识树(附可视化图谱)

在动手编码前,先理清 C# MVC 的知识框架,避免「边学边忘」。以下是基于实际开发场景梳理的知识树图谱,涵盖核心组件、机制、高级应用及部署优化:

C# MVC 知识体系

核心组件

核心机制

高级应用

部署与优化

Model 层

实体Model映射数据库表

ViewModel为View定制数据

Dto跨层数据传输

数据验证DataAnnotations/自定义验证

View 层

Razor视图.cshtml

部分视图PartialView,复用片段

视图组件ViewComponent,复杂UI封装

Razor语法变量循环条件

Controller 层

Action方法处理请求

ActionResult类型View-Redirect-Json等

控制器生命周期构造-Action-执行释放

路由系统

默认路由-controller-action-id-

自定义路由特性路由-路由约束

路由优先级先定义先匹配

模型绑定

表单绑定POST请求

URL参数绑定GET请求

JSON绑定AJAX请求

过滤器

授权过滤器Authorize,权限控制

动作过滤器ActionFilter,前后置处理

异常过滤器ExceptionFilter,统一异常处理

依赖注入DI

构造函数注入推荐

属性注入慎用

区域Area,按模块拆分项目

异步ActionAsync/Await,提升并发

缓存机制OutputCache/内存缓存

文件上传下载HttpPostedFileBase

IIS部署配置应用池/端口

性能优化压缩响应/懒加载

日志记录Log4net/NLog

3. 实战上手:从零搭建学生管理系统(完整代码)

理论结合实践是掌握 MVC 的关键。下面我们将搭建一个学生管理系统,覆盖「增删查」核心功能,代码可直接复制运行(基于.NET Framework 4.8)。

3.1 第一步:创建 MVC 项目

打开 Visual Studio → 新建项目 → 选择「ASP.NET Web 应用程序(.NET Framework)」;
项目名称输入「StudentManagement」,框架选择「.NET Framework 4.8」;
模板选择「MVC」,取消勾选「配置 HTTPS」(简化演示),点击「创建」。

3.2 Model 层:定义数据实体与验证规则

Model 层负责数据结构定义和数据验证,避免无效数据流入业务逻辑。我们创建Student类,并通过DataAnnotations添加验证规则:

1// 路径:Models/Student.cs
2using System.ComponentModel.DataAnnotations;
3
4namespace StudentManagement.Models
5{
6    public class Student
7    {
8        // 主键(实际项目中由数据库自增)
9        public int Id { get; set; }
10
11        [Display(Name = "学生姓名")] // 视图中显示的标签名
12        [Required(ErrorMessage = "请输入学生姓名")] // 必填项
13        [StringLength(50, ErrorMessage = "姓名长度不能超过50个字符")] // 长度限制
14        public string Name { get; set; }
15
16        [Display(Name = "学生年龄")]
17        [Range(6, 25, ErrorMessage = "年龄必须在6-25岁之间")] // 数值范围
18        public int Age { get; set; }
19
20        [Display(Name = "联系电话")]
21        [Phone(ErrorMessage = "请输入有效的电话号码")] // 电话格式验证
22        public string Phone { get; set; }
23
24        [Display(Name = "电子邮箱")]
25        [EmailAddress(ErrorMessage = "请输入有效的电子邮箱地址")] // 邮箱格式验证
26        public string Email { get; set; }
27    }
28}
29

3.3 Controller 层:处理请求与业务逻辑

Controller 是「请求入口」,负责接收用户请求、调用业务逻辑、返回响应结果。我们创建StudentController,实现「列表展示、详情查看、添加、删除」功能:

1// 路径:Controllers/StudentController.cs
2using System.Collections.Generic;
3using System.Linq;
4using System.Web.Mvc;
5using StudentManagement.Models;
6
7namespace StudentManagement.Controllers
8{
9    public class StudentController : Controller
10    {
11        // 模拟数据库(实际项目中替换为Entity Framework等ORM)
12        private static List<Student> _studentList = new List<Student>
13        {
14            new Student { Id = 1, Name = "张三", Age = 18, Phone = "13800138000", Email = "[email protected]" },
15            new Student { Id = 2, Name = "李四", Age = 19, Phone = "13900139000", Email = "[email protected]" }
16        };
17
18        // GET: Student/Index → 展示学生列表
19        public ActionResult Index()
20        {
21            // 将学生列表传递给View(View会自动接收Model)
22            return View(_studentList);
23        }
24
25        // GET: Student/Details/1 → 查看单个学生详情(带参数id)
26        public ActionResult Details(int id)
27        {
28            // 根据id查询学生
29            var student = _studentList.FirstOrDefault(s => s.Id == id);
30            if (student == null)
31            {
32                return HttpNotFound("学生不存在!"); // 返回404
33            }
34            return View(student);
35        }
36
37        // GET: Student/Create → 显示「添加学生」表单(无业务逻辑,仅返回视图)
38        public ActionResult Create()
39        {
40            return View();
41        }
42
43        // POST: Student/Create → 处理「添加学生」的提交请求([HttpPost]标记POST请求)
44        [HttpPost]
45        [ValidateAntiForgeryToken] // 防止CSRF(跨站请求伪造)攻击
46        public ActionResult Create(Student student)
47        {
48            // 关键:检查Model验证是否通过(对应Model中的DataAnnotations规则)
49            if (ModelState.IsValid)
50            {
51                // 生成新ID(实际项目中由数据库自增)
52                student.Id = _studentList.Max(s => s.Id) + 1;
53                _studentList.Add(student); // 新增学生
54                return RedirectToAction("Index"); // 重定向到列表页(防止表单重复提交)
55            }
56
57            // 若验证失败,返回表单页,保留用户已输入的内容
58            return View(student);
59        }
60
61        // GET: Student/Delete/1 → 显示「删除确认」页面
62        public ActionResult Delete(int id)
63        {
64            var student = _studentList.FirstOrDefault(s => s.Id == id);
65            if (student == null)
66            {
67                return HttpNotFound("学生不存在!");
68            }
69            return View(student);
70        }
71
72        // POST: Student/Delete/1 → 处理「删除学生」的提交请求(ActionName指定匹配的GET方法名)
73        [HttpPost, ActionName("Delete")]
74        [ValidateAntiForgeryToken]
75        public ActionResult DeleteConfirmed(int id)
76        {
77            var student = _studentList.FirstOrDefault(s => s.Id == id);
78            if (student != null)
79            {
80                _studentList.Remove(student); // 删除学生
81            }
82            return RedirectToAction("Index");
83        }
84    }
85}
86

3.4 View 层:渲染页面与用户交互

View 层负责页面渲染,通过 Razor 语法(@开头)绑定 Model 数据,生成 HTML。下面是核心视图的代码:

3.4.1 列表页(Index.cshtml)

展示所有学生,提供「添加」「查看」「删除」入口:

1预览
2// 路径:Views/Student/Index.cshtml
3@model IEnumerable<StudentManagement.Models.Student> <!-- 绑定Model类型(集合) -->
4
5@{
6    ViewBag.Title = "学生列表"; // 页面标题(对应浏览器标签)
7    Layout = "~/Views/Shared/_Layout.cshtml"; // 引用共享布局(导航栏、页脚等复用)
8}
9
10<h2 class="mb-4">学生管理系统</h2>
11
12<!-- 「添加学生」按钮(跳转到Create视图) -->
13<p>
14    @Html.ActionLink("添加新学生", "Create", null, new { @class = "btn btn-primary" })
15</p>
16
17<!-- 学生列表表格 -->
18<table class="table table-bordered">
19    <thead>
20        <tr>
21            <th>@Html.DisplayNameFor(model => model.Name)</th> <!-- 显示Model的Display属性(学生姓名) -->
22            <th>@Html.DisplayNameFor(model => model.Age)</th>
23            <th>@Html.DisplayNameFor(model => model.Phone)</th>
24            <th>@Html.DisplayNameFor(model => model.Email)</th>
25            <th>操作</th>
26        </tr>
27    </thead>
28    <tbody>
29        <!-- 循环遍历Model(学生集合) -->
30        @foreach (var item in Model)
31        {
32            <tr>
33                <td>@Html.DisplayFor(modelItem => item.Name)</td> <!-- 显示学生姓名 -->
34                <td>@Html.DisplayFor(modelItem => item.Age)</td>
35                <td>@Html.DisplayFor(modelItem => item.Phone)</td>
36                <td>@Html.DisplayFor(modelItem => item.Email)</td>
37                <td>
38                    <!-- 「查看详情」按钮(跳转到Details视图,传递id参数) -->
39                    @Html.ActionLink("查看", "Details", new { id = item.Id }, new { @class = "btn btn-sm btn-info" })
40                    <!-- 「删除」按钮(跳转到Delete视图,传递id参数) -->
41                    @Html.ActionLink("删除", "Delete", new { id = item.Id }, new { @class = "btn btn-sm btn-danger ml-2" })
42                </td>
43            </tr>
44        }
45    </tbody>
46</table>
47
3.4.2 添加表单页(Create.cshtml)

提供表单输入,支持实时验证(基于 Model 的规则):

1预览
2// 路径:Views/Student/Create.cshtml
3@model StudentManagement.Models.Student <!-- 绑定单个Student对象 -->
4
5@{
6    ViewBag.Title = "添加新学生";
7    Layout = "~/Views/Shared/_Layout.cshtml";
8}
9
10<h2 class="mb-4">添加新学生</h2>
11
12<!-- 表单:提交到Student/Create(POST请求) -->
13@using (Html.BeginForm())
14{
15    @Html.AntiForgeryToken() <!-- 与Controller中的[ValidateAntiForgeryToken]对应 -->
16    
17    <div class="form-horizontal">
18        <hr />
19        <!-- 显示验证错误汇总(若有) -->
20        @Html.ValidationSummary(true, "", new { @class = "alert alert-danger" })
21
22        <!-- 姓名输入框 -->
23        <div class="form-group">
24            @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" }) <!-- 标签 -->
25            <div class="col-md-10">
26                <!-- 输入框:自动绑定Model的Name属性,保留用户输入 -->
27                @Html.EditorFor(model => model.Name, new { @class = "form-control" })
28                <!-- 显示单个字段的验证错误(如“请输入学生姓名”) -->
29                @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
30            </div>
31        </div>
32
33        <!-- 年龄输入框(同理) -->
34        <div class="form-group">
35            @Html.LabelFor(model => model.Age, new { @class = "control-label col-md-2" })
36            <div class="col-md-10">
37                @Html.EditorFor(model => model.Age, new { @class = "form-control" })
38                @Html.ValidationMessageFor(model => model.Age, "", new { @class = "text-danger" })
39            </div>
40        </div>
41
42        <!-- 电话、邮箱输入框(省略,与上面结构一致) -->
43        <div class="form-group">
44            @Html.LabelFor(model => model.Phone, new { @class = "control-label col-md-2" })
45            <div class="col-md-10">
46                @Html.EditorFor(model => model.Phone, new { @class = "form-control" })
47                @Html.ValidationMessageFor(model => model.Phone, "", new { @class = "text-danger" })
48            </div>
49        </div>
50
51        <div class="form-group">
52            @Html.LabelFor(model => model.Email, new { @class = "control-label col-md-2" })
53            <div class="col-md-10">
54                @Html.EditorFor(model => model.Email, new { @class = "form-control" })
55                @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
56            </div>
57        </div>
58
59        <!-- 提交按钮 -->
60        <div class="form-group">
61            <div class="col-md-offset-2 col-md-10">
62                <input type="submit" value="保存" class="btn btn-success" />
63            </div>
64        </div>
65    </div>
66}
67
68<!-- 返回列表页按钮 -->
69<div class="col-md-offset-2">
70    @Html.ActionLink("返回列表", "Index", new { @class = "btn btn-default" })
71</div>
72
73<!-- 引入jQuery验证脚本(实现客户端实时验证) -->
74@section Scripts {
75    @Scripts.Render("~/bundles/jqueryval")
76}
77

3.5 运行效果

按F5启动项目,在地址栏输入/Student/Index,即可看到学生列表;
点击「添加新学生」,输入无效数据(如年龄 30),会实时提示验证错误;
输入有效数据后点击「保存」,会跳转到列表页,新学生已添加;
点击「查看」可查看详情,点击「删除」可删除学生。

4. 开发必避:5 个高频 “坑点” 及解决方案

在实际开发中,新手常因对 MVC 机制理解不深踩坑。以下是 5 个最常见的问题,附「错误代码→原因→解决方案」:

4.1 坑点 1:路由配置冲突导致 404

现象
访问/Student/Details/abc时,期望返回 404(id 应为数字),但却进入了错误页面,或访问/Home/Index时出现 404。
错误代码(路由配置)

1// 路径:App_Start/RouteConfig.cs
2public class RouteConfig
3{
4    public static void RegisterRoutes(RouteCollection routes)
5    {
6        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
7
8        // 错误:自定义路由放在默认路由之后,导致自定义路由不生效
9        routes.MapRoute(
10            name: "Default",
11            url: "{controller}/{action}/{id}",
12            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
13        );
14
15        // 自定义路由:限制id为数字({id:int}是路由约束)
16        routes.MapRoute(
17            name: "StudentDetails",
18            url: "Student/Details/{id:int}",
19            defaults: new { controller = "Student", action = "Details" }
20        );
21    }
22}
23

原因
MVC 路由匹配遵循「先定义先匹配」原则,默认路由(无约束)会优先匹配/Student/Details/abc,但Details方法的id参数是int类型,类型不匹配导致报错。
解决方案
自定义路由(带约束)放在默认路由之前;
优先使用特性路由(更灵活,在 Action 上直接定义):

1// 在StudentController的Details方法上添加特性路由
2[Route("Student/Details/{id:int}")] // 仅匹配id为数字的请求
3public ActionResult Details(int id)
4{
5    // 业务逻辑...
6}
7

4.2 坑点 2:忽略 ModelState 验证导致脏数据

现象
用户输入年龄 30(超过 Model 中Range(6,25)的限制),却能成功添加到列表中。
错误代码

1[HttpPost]
2[ValidateAntiForgeryToken]
3public ActionResult Create(Student student)
4{
5    // 错误:未检查ModelState.IsValid,直接执行添加逻辑
6    student.Id = _studentList.Max(s => s.Id) + 1;
7    _studentList.Add(student);
8    return RedirectToAction("Index");
9}
10

原因
ModelState.IsValid是 MVC 验证的核心 —— 它会检查 Model 中的DataAnnotations规则、类型匹配等。忽略该判断会导致无效数据流入业务逻辑。
解决方案
必须在处理业务逻辑前检查ModelState.IsValid,如 3.3 节中的正确代码所示。

4.3 坑点 3:ViewModel 滥用导致 View 逻辑混乱

现象
在「学生详情页」中,需要显示学生的课程列表(关联数据),直接将Student和List放在ViewBag中,View 中需要频繁判断null,代码杂乱。
错误代码

1// Controller中
2public ActionResult Details(int id)
3{
4    var student = _studentList.FirstOrDefault(s => s.Id == id);
5    ViewBag.Courses = _courseList.Where(c => c.StudentId == id).ToList(); // 用ViewBag传递关联数据
6    return View(student);
7}
8
9// View中
10@foreach (var course in ViewBag.Courses) // ViewBag是dynamic类型,无智能提示,易出错
11{
12    <li>@course.Name</li>
13}
14

原因
ViewBag是弱类型(dynamic),无智能提示,且无法验证数据;直接传递实体 Model 无法满足 View 的复杂数据需求(如关联数据、页面专用字段)。
解决方案
使用ViewModel(为 View 定制的 Model),封装 View 所需的所有数据:

1// 路径:Models/ViewModels/StudentDetailsViewModel.cs
2public class StudentDetailsViewModel
3{
4    public Student Student { get; set; } // 学生基本信息
5    public List<Course> EnrolledCourses { get; set; } // 已选课程列表
6    public string PageTitle { get; set; } // 页面标题(View专用字段)
7}
8
9// Controller中
10public ActionResult Details(int id)
11{
12    var student = _studentList.FirstOrDefault(s => s.Id == id);
13    var courses = _courseList.Where(c => c.StudentId == id).ToList();
14    
15    // 封装ViewModel
16    var viewModel = new StudentDetailsViewModel
17    {
18        Student = student,
19        EnrolledCourses = courses,
20        PageTitle = $"【{student.Name}】的详情"
21    };
22    
23    return View(viewModel); // 传递ViewModel到View
24}
25
26// View中(强类型,有智能提示)
27@model StudentManagement.Models.ViewModels.StudentDetailsViewModel
28
29<h2>@Model.PageTitle</h2>
30<p>姓名:@Model.Student.Name</p>
31<h4>已选课程</h4>
32@foreach (var course in Model.EnrolledCourses)
33{
34    <li>@course.Name</li>
35}
36

4.4 坑点 4:Action 返回类型错误导致前端异常

现象
AJAX 请求/Student/GetStudentJson/1时,期望返回 JSON 数据,却收到 HTML 页面。
错误代码

1// 错误:AJAX请求期望返回JSON,但返回了View(HTML)
2public ActionResult GetStudentJson(int id)
3{
4    var student = _studentList.FirstOrDefault(s => s.Id == id);
5    return View(student); // 返回HTML视图
6}
7

原因
Action 返回类型需与前端需求匹配:AJAX 请求需返回JsonResult,页面跳转需返回ViewResult或RedirectResult。
解决方案
根据需求选择正确的ActionResult类型:

1// 正确:返回JSON数据(JsonRequestBehavior.AllowGet允许GET请求获取JSON)
2public JsonResult GetStudentJson(int id)
3{
4    var student = _studentList.FirstOrDefault(s => s.Id == id);
5    return Json(student, JsonRequestBehavior.AllowGet);
6}
7

4.5 坑点 5:过滤器执行顺序错误导致权限失效

现象
添加了[Authorize](授权过滤器)和[MyLogFilter](自定义日志过滤器),但未登录用户仍能访问需要授权的 Action。
错误代码

1// 自定义日志过滤器(实现IActionFilter)
2public class MyLogFilter : ActionFilterAttribute
3{
4    public override void OnActionExecuting(ActionExecutingContext filterContext)
5    {
6        // 日志逻辑...
7        base.OnActionExecuting(filterContext);
8    }
9}
10
11// Controller中:过滤器顺序错误(日志过滤器在前,授权过滤器在后)
12[MyLogFilter]
13[Authorize] // 授权过滤器后执行,导致未登录用户先被记录日志,再被拦截
14public class StudentController : Controller
15{
16    //  Action...
17}
18

原因
MVC 过滤器执行顺序固定:授权过滤器 → 动作过滤器 → 结果过滤器 → 异常过滤器。若授权过滤器在后执行,会导致其他逻辑先执行,再拦截未登录用户。
解决方案
遵循默认执行顺序,授权过滤器([Authorize])放在最前面;
若需自定义顺序,通过Order属性指定(值越小越先执行):

1[Authorize(Order = 1)] // 先执行授权
2[MyLogFilter(Order = 2)] // 后执行日志
3public class StudentController : Controller
4{
5    //  Action...
6}
7

5. 互动交流:邀你一起深化 MVC 技能

学习的本质是「输入→实践→反馈」,以下 3 个互动问题,期待你的参与:
踩坑分享: 你在 C# MVC 开发中遇到过哪些印象深刻的坑?是如何解决的?欢迎在评论区分享你的经历!
功能扩展: 基于本文的学生管理系统,尝试扩展「编辑学生信息」功能(需要Edit Action 和对应的 View),完成后可以贴出核心代码,我会抽时间点评!
疑问征集: 你对 C# MVC 的哪个知识点(如 ViewComponent、Area、异步 Action)还有疑问?或者想了解「C# MVC 与ASP.NET Core MVC 的区别」?评论区告诉我,后续文章可能会优先覆盖这些内容!

6. 结语:MVC 的进阶之路

C# MVC 的核心不是「语法」,而是「分层思想」—— 通过 Model 解耦数据,通过 View 解耦 UI,通过 Controller 解耦业务逻辑。掌握这些思想后,无论是切换到ASP.NET Core MVC,还是学习其他分层框架(如 Spring MVC),都会事半功倍。
本文的代码和避坑指南可直接用于实际项目,建议大家动手复现一遍,遇到问题时对照知识树梳理思路。最后,祝大家在 MVC 的进阶之路上少踩坑、多提效!
如果觉得本文有帮助,欢迎点赞、收藏,也欢迎关注我,后续会分享更多.NET 开发干货!


深入浅出 C# MVC:从基础实践到避坑指南(附完整代码示例)》 是转载文章,点击查看原文


相关推荐


【Node】认识一下Node.js 中的 VM 模块
你的人类朋友2025/10/10

前言 今天介绍 Node.js 中的 VM(Virtual Machine)模块的基本概念和使用方法。 很多人不太了解他,比如在下 所以本文也不会过于深入,会偏向入门! 小目标:看完之后向自己解释一下:啥是 VM 模块?它有什么作用? 什么是 VM 模块 VM 模块是 Node.js 内置的模块,用于在 V8 虚拟机上下文中编译和执行 JavaScript 代码。 说人话就是,VM 模块允许你在隔离的环境中运行 JavaScript 代码。 核心功能 这边用代码进行举例子,后面会介绍具体的使用


OSI 七层模型
日更嵌入式的打工靓仔2025/10/9

一、OSI 七层模型的核心定位与价值​ OSI 七层模型(Open Systems Interconnection Reference Model)是国际标准化组织(ISO)于 1984 年制定的网络通信体系结构标准,其核心目标是打破不同厂商设备的通信壁垒,通过分层化设计实现 “功能解耦、接口标准化”。该模型将网络通信的复杂流程拆解为七个逻辑层次,每层通过定义明确的 “服务原语”(Service Primitive)为上层提供服务,并通过 “协议数据单元(PDU)” 与下层交互,确保不同系统间


【前端工程化】脚手架篇 - 模板引擎 & 动态依赖管理脚手架
ObjectX不知名程序员2025/10/7

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣 在日常工作中,我们经常为会遇到需要创建新项目的需求,为了统计代码风格,项目配置,提升效率,我们可以创建一个cli工具,帮助我们实现这样的功能。你也可以搭建一个自己用,毕竟省下来的时间都是自己的 🥑 你能学到什么? 希望在你阅读本篇文章之后,不会觉得浪费了时间。如果你跟着读下来,你将会学到: cli工具的基本搭建流程 如何通过模板引擎实现可选依赖 模板系统如何设计 如何根据模板引擎生成所需项目 熟悉一个组件库的基本结构 熟悉一


在AI技术快速实现创意的时代,挖掘游戏开发框架新需求成为关键
qife1222025/10/6

内容描述 核心功能定位:该项目是一个专为经典游戏主机设计的增强型JavaScript运行环境,旨在为用户提供完整的自制软件开发工具包。它通过简化开发流程,让开发者能够使用JavaScript这一简单语言创建游戏和应用程序,无需编译过程,只需编写脚本即可快速测试。 关键应用场景:主要应用于经典游戏主机的自制软件开发,包括游戏创作、应用程序开发、图形渲染、音频处理、网络通信等多个领域。开发者可以利用该环境快速原型设计和开发各类交互式内容。 功能特性 多模块支持:系统提供丰富的功能模块,


【Matlab】matlab代码实现最小凸包
智慧浩海2025/10/4

实现最小凸包的算法有多种方法,其中一种常见的方法是使用Graham扫描算法。下面是用Matlab实现Graham扫描算法找到最小凸包的示例代码: function [convexHull] = grahamScan(points) % 找到包含所有点的最小凸包 n = length(points); % 找到y坐标最小的点作为起始点 [~,idx] = min(points(:,2)); startPoint = points(idx,:);


【深入浅出PyTorch】--3.1.PyTorch组成模块1
西柚小萌新吖(●ˇ∀ˇ●)2025/10/3

通过本节学习,你将掌握: 机器学习/深度学习任务的整体流程。各个阶段在任务中的作用与实现方式。深度学习与传统机器学习在实现上的关键差异。PyTorch 如何支持深度学习任务的模块化实现。 二、机器学习任务的标准流程 步骤内容说明1. 数据预处理- 统一数据格式 - 清除异常值 - 进行必要的数据变换(如归一化、标准化) - 划分数据集:训练集、验证集、测试集 - 常见方法:按比例随机划分、KFold 交叉验证 - 工具支持:sklearn.model_selection.train_t


PlantUML 完整教程:从入门到精通
对不起初见2025/10/2

什么是 PlantUML PlantUML 是一个开源工具,允许用户使用简单直观的文本描述来快速创建 UML 图表。它基于纯文本语法,能够生成多种类型的图表,包括时序图、用例图、类图、活动图、组件图、状态图等。 PlantUML 的核心理念是:用代码画图,让图表版本可控。 核心特点 • 文本驱动:使用简单的文本语法描述图表 • 版本控制友好:纯文本格式可轻松集成到 Git 等版本控制系统 • 多格式输出:支持 PNG、SVG、PDF、LaTeX 等多种输出格式 • 跨平台:基于 Java,可在


第6篇、Flask 表单处理与用户认证完全指南:从零到实战
何双新2025/10/2

标签:Python Flask Web开发 表单验证 Session Cookie 用户认证 安全编程 🎯 为什么选择这篇文章? 在Web开发的世界里,表单处理和用户认证是每个开发者必须掌握的核心技能。无论是构建电商网站、社交平台还是企业管理系统,都离不开用户登录、数据提交、状态保持这些基础功能。 Flask作为Python最轻量级的Web框架,以其简洁优雅的设计理念,让开发者能够快速构建功能完整的Web应用。本文将带你从零开始,深入理解Flask的表单处理机制,掌握Session和


微服务架构:从单机到分布式的革命性升级
chengooooooo10/2/2025

本文探讨了传统单机服务的缺陷及微服务架构的解决方案。单机模式存在单点故障、扩展性差、强耦合、技术栈受限等问题。微服务通过将系统拆分为独立服务,实现解耦、独立部署、技术多样性,并提供了分布式架构下的解决方案。SpringCloud提供了服务熔断、限流、服务注册与发现、配置中心、API网关等核心组件,同时介绍了分布式追踪、消息队列和分布式事务的实现方式。相比单机部署,微服务利用云计算实现动态资源分配和自动化管理,提高了系统的可用性和扩展性。


Excel文件瘦身指南:快速瘦身,告别卡顿-Excel易用宝
Excel_easy10/1/2025

明明工作簿文件中没有几行数据,打开表格的时候要等好一会儿,写个VLOOKUP函数公式鼠标指针都要转半天。其实这是由于文件中积累着各种冗余的信息导致的表格体积变大,计算卡顿等现象。单击【易用宝】→【工作簿】→【Excel文件瘦身】。表格文件超大,打开卡顿,闪烁,这种慢慢慢,烦人!我们只需给表格文件瘦个身就ok了。你有没有遇到过这种情况呢?

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0