简介这是一份 C# ASP.NET 通讯录系统完整项目面向初次接触 .NET Web 开发的初学者帮助理解基于 Web 的联系人管理应用从界面到数据库的完整实现。项目使用 C# 与 ASP.NET Web Forms 构建服务器端逻辑SQL Server 数据库存储联系人信息涵盖增删改查、分组管理与登录验证等典型功能。压缩包共 92 个文件包含 27 个 .cs 源码文件、19 个 .aspx 页面文件、25 个 .gif 图片素材以及数据库文件、样式表和配置文件等整体大小约 5.53MB目录结构清晰便于按模块对照学习。目前已有 300 人下载学习。通过这套源码可以一边运行一边拆解页面事件、业务逻辑与数据库交互方式同时参考其 Visual Studio 2005 环境下的项目组织方式和 ADO.NET 数据访问写法是巩固 Web 开发基础的不错实例。1. 一个“C# ASP.NET 通讯录”为什么值得你亲手做一遍“C# ASP.NET 通讯录”是很多人学 Web 开发碰到的第一个完整项目但能把它做到能交付、能部署、别人敢往里录真数据的人并不多。大多数版本停在“本机跑得欢换个环境就白屏”“录十个联系人没事录到一千个就卡成幻灯片”的状态。这篇笔记把我平时做这类内部系统的完整套路讲清楚从字段设计、技术选型、EF 建表到增删改查、搜索分页、导出名单再把最常翻车的几个场景单独拎出来复盘。新手可以照着一步步做出能运行的项目熟手也能在参数设置和部署边界上找到有用的提醒。适合刚学完 C# 基础、想独立走通一个 Web 全流程的初学者。适合要把通讯录改造成团队内部工具但担心数据安全和维护成本的开发者。也会聊到上线前容易忽略的细节——那一部分对做过一两个项目的人同样有价值。2. 动手前先想清楚通讯录的信息模型与 ASP.NET 技术选型很多人打开 IDE 就写代码写到一半发现字段不够用、查询逻辑别扭再回头改表结构。通讯录虽然简单但信息模型和技术路线最好先定下来后面几乎所有代码都围绕这两个决定展开。2.1 联系人数据模型字段怎么定哪些是刚需联系人字段我通常按“必填 高频 扩展”三档来分。必填只有两个姓名和手机号。高频包括邮箱、公司、地址、生日、备注。扩展字段比如头像、分组、标签可以等第一版跑通后再加不要一开始就陷入字段设计的完美主义。下面是我常用的联系人表结构直接照着建即可字段C# 类型数据库类型说明Idintint 主键自增无业务意义主键Namestringnvarchar(20)联系人姓名GenderGender 枚举int0 未知1 男2 女Phonestringnvarchar(20)手机或座机号码Emailstringnvarchar(100)邮箱Companystringnvarchar(50)公司名称Addressstringnvarchar(200)通讯地址BirthdayDateTime?datetime 可空生日可空Remarkstringnvarchar(500)备注CreatedAtDateTimedatetime创建时间排序用手机号这里特别说一下我坚持用字符串而不是 bigint。原因有两个手机号可能带 86 前缀固话可能带分机号数值类型会丢掉开头的 0比如某些短号。另一个原因是搜索场景用户输入“138”就希望匹配所有以 138 开头的号码只有字符串才能方便地做 LIKE 查询。生日字段用可空类型 DateTime?因为现实里确实有人不愿意填生日。性别用枚举而不用 bool是因为很多表单需要“未设置”这个初始态bool 只有两个值会在页面下拉框里造成歧义。CreatedAt 看起来不起眼却是列表排序的稳定依据——联系人经常重名不能用姓名排序。这里有个新手容易踩的点给 Name 加唯一索引。通讯录不是用户系统多个同名人完全合法加唯一索引会导致第二个“张三”录不进去。唯一性约束只应该放在真正需要的地方比如后面章节要给手机号做去重时再加。2.2 ASP.NET MVC 还是 Web Forms我为什么选 MVC 5ASP.NET 生态里老项目很多是 Web Forms但新写的内部工具类项目我基本都选 MVC 5。两者本质差别在页面组织方式上下面是关键对比维度Web FormsMVC 5页面机制事件驱动 ViewState 回发请求驱动 Model 绑定HTML 控制力控件生成难调完全手写视图测试难度逻辑耦合页面难单测Controller 可独立测技能迁移转 .NET Core 学习成本高转 ASP.NET Core 几乎平迁通讯录这种以列表、表单、搜索为主要交互的系统MVC 的优势非常明显每个页面就是一个 Action请求参数通过 Model 绑定自动变成强类型对象省去 Request.Form[name] 这种字符串取值也天然规避了手工拼 SQL 的冲动。另外MVC 的 Razor 视图对 HTML 输出默认编码用户在备注里写