简介:这是一份 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# 类型 | 数据库类型 | 说明 |
|---|---|---|---|
| Id | int | int 主键自增 | 无业务意义主键 |
| Name | string | nvarchar(20) | 联系人姓名 |
| Gender | Gender 枚举 | int | 0 未知,1 男,2 女 |
| Phone | string | nvarchar(20) | 手机或座机号码 |
| string | nvarchar(100) | 邮箱 | |
| Company | string | nvarchar(50) | 公司名称 |
| Address | string | nvarchar(200) | 通讯地址 |
| Birthday | DateTime? | datetime 可空 | 生日,可空 |
| Remark | string | nvarchar(500) | 备注 |
| CreatedAt | DateTime | datetime | 创建时间,排序用 |
手机号这里特别说一下,我坚持用字符串而不是 bigint。原因有两个:手机号可能带 +86 前缀,固话可能带分机号;数值类型会丢掉开头的 0,比如某些短号。另一个原因是搜索场景,用户输入“138”就希望匹配所有以 138 开头的号码,只有字符串才能方便地做 LIKE 查询。
生日字段用可空类型 DateTime?,因为现实里确实有人不愿意填生日。性别用枚举而不用 bool,是因为很多表单需要“未设置”这个初始态,bool 只有两个值,会在页面下拉框里造成歧义。CreatedAt 看起来不起眼,却是列表排序的稳定依据——联系人经常重名,不能用姓名排序。
这里有个新手容易踩的点:给 Name 加唯一索引。通讯录不是用户系统,多个同名人完全合法,加唯一索引会导致第二个“张三”录不进去。唯一性约束只应该放在真正需要的地方,比如后面章节要给手机号做去重时再加。
2.2 ASP.NET MVC 还是 Web Forms:我为什么选 MVC 5
ASP.NET 生态里老项目很多是 Web Forms,但新写的内部工具类项目,我基本都选 MVC 5。两者本质差别在页面组织方式上,下面是关键对比:
| 维度 | Web Forms | MVC 5 |
|---|---|---|
| 页面机制 | 事件驱动 + ViewState 回发 | 请求驱动 + Model 绑定 |
| HTML 控制力 | 控件生成,难调 | 完全手写视图 |
| 测试难度 | 逻辑耦合页面,难单测 | Controller 可独立测 |
| 技能迁移 | 转 .NET Core 学习成本高 | 转 ASP.NET Core 几乎平迁 |
通讯录这种以列表、表单、搜索为主要交互的系统,MVC 的优势非常明显:每个页面就是一个 Action,请求参数通过 Model 绑定自动变成强类型对象,省去 Request.Form["name"] 这种字符串取值,也天然规避了手工拼 SQL 的冲动。
另外,MVC 的 Razor 视图对 HTML 输出默认编码,用户在备注里写