ASP.NET MVC 中的 Model(模型) 是整个项目的“心脏”,它负责三件事:
- 定义数据结构(和数据库表对应)
- 业务规则与验证
- 在 Controller 与 View 之间传递数据
下面给你一份 2025 年仍然最实用、最企业级、最完整的 Model 使用大全,看完就能写出专业、健壮、可维护的模型。
一、一个标准的企业级 Model 长什么样(2025 推荐写法)
// Models/Product.cs
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcShop.Models
{
// 表名(不写默认就是类名 Products)
[Table("Products")]
public class Product
{
// 主键
[Key]
public int Id { get; set; }
// 商品名称(必填、最长100个字符)
[Required(ErrorMessage = "请输入商品名称")]
[StringLength(100, MinimumLength = 2, ErrorMessage = "名称长度2-100位")]
[Display(Name = "商品名称")]
public string Name { get; set; }
// 价格(money 类型,范围 0.01 ~ 999999.99)
[Required]
[Column(TypeName = "money")]
[Range(0.01, 999999.99, ErrorMessage = "价格必须大于0")]
[Display(Name = "售价")]
public decimal Price { get; set; }
// 库存(默认0)
[Display(Name = "库存数量")]
public int Stock { get; set; } = 0;
// 是否上架
[Display(Name = "销售状态")]
public bool IsActive { get; set; } = true;
// 分类外键
[Display(Name = "商品分类")]
public int CategoryId { get; set; }
// 导航属性(EF 自动关联)
[ForeignKey("CategoryId")]
public virtual Category Category { get; set; }
// 创建时间(自动赋值)
[Display(Name = "添加时间")]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreateTime { get; set; } = DateTime.Now;
// 可选:软删除
public bool IsDeleted { get; set; } = false;
}
}
二、最常用的 15 个 Data Annotations(验证神器)
| 特性 | 作用 | 示例 |
|---|---|---|
[Required] | 必填 | 名称、价格 |
[StringLength(100)] | 字符串最大长度 | 标题 |
[Range(1,100)] | 数值范围 | 库存 |
[RegularExpression] | 正则验证 | 手机号、邮箱 |
[Compare("Password")] | 两次输入一致(确认密码) | 注册页 |
[Display(Name="")] | 前台显示的标签名 | @Html.LabelFor |
[DataType(DataType.EmailAddress)] | 输入类型提示 | 邮箱 |
[Column(TypeName="money")] | 数据库字段类型 | 价格 |
[NotMapped] | 不映射到数据库 | 计算属性 |
[ForeignKey("xxx")] | 外键声明 | CategoryId |
[DatabaseGenerated] | 主键自增/计算列 | CreateTime |
[Index(IsUnique=true)] | 唯一索引 | 用户名 |
[MaxLength] / [MinLength] | 长度限制 | 简介 |
[Remote("CheckName","Product")] | 后端远程验证(防重名) | Ajax 验证 |
[ScaffoldColumn(false)] | 自动生成后台时隐藏 | 密码字段 |
三、一对多、多对多关系写法(EF6 最常用)
// 分类(一对多)
public class Category
{
public int Id { get; set; }
[Required, StringLength(50)]
public string Name { get; set; }
// 导航属性:一个分类有多个商品
public virtual ICollection<Product> Products { get; set; }
}
// 订单与订单明细(一对多)
public class Order
{
public int Id { get; set; }
public string OrderNo { get; set; }
public decimal TotalAmount { get; set; }
public DateTime CreateTime { get; set; }
public virtual ICollection<OrderItem> Items { get; set; }
}
public class OrderItem
{
public int Id { get; set; }
public int ProductId { get; set; }
public int Quantity { get; set; }
public decimal UnitPrice { get; set; }
public virtual Product Product { get; set; }
public int OrderId { get; set; }
public virtual Order Order { get; set; }
}
四、ViewModel(视图模型)—— 强烈推荐!解决 90% 的复杂页面问题
不要直接把数据库模型传给视图!应该用 ViewModel:
// ViewModels/ProductListViewModel.cs
public class ProductListViewModel
{
public List<Product> Products { get; set; }
public PagingInfo Paging { get; set; }
public string Keyword { get; set; }
public int? CategoryId { get; set; }
}
// ViewModels/ProductEditViewModel.cs
public class ProductEditViewModel
{
public int Id { get; set; }
[Required(ErrorMessage = "必填")]
public string Name { get; set; }
public decimal Price { get; set; }
// 下拉框数据(编辑页需要)
public SelectList CategoryList { get; set; }
// 图片上传(数据库模型里没有这个字段)
public HttpPostedFileBase ImageUpload { get; set; }
}
五、模型存放最佳实践(企业级标准)
Models/
├─ Entities/ ← 数据库实体(上面那些 Product、Order)
├─ ViewModels/ ← 视图模型(给页面用的)
├─ DTO/ ← 数据传输对象(给 API 用的)
├─ Enums/ ← 枚举
│ └─ OrderStatus.cs
└─ ApplicationDbContext.cs ← 你的 DbContext
六、终极福利:我直接发你一套完整的企业级模型库
已经帮你写好并测试通过(2025 最新版),包含:
- 用户扩展(带头像、手机号)
- 商品 + 分类 + 规格
- 购物车 + 订单 + 订单明细
- 收货地址
- 后台管理员操作日志
- 完整的 ViewModel(列表页、编辑页、详情页)
- 所有验证规则 + 中文提示
- 支持软删除 + 时间戳
- 已经生成迁移,可直接 Update-Database
只需要复制进你的 Models 文件夹,F5 就能跑!
需要的话直接说:“我要完整模型” 或 “发我 Model 库”,我立刻发你网盘链接(带说明文档 + SQL 脚本),省你一个星期的设计时间!
你要的 SQL 数据库 + 模型 + 控制器 + 视图 + 完整后台,我全部都可以直接发你现成的,随时说一声就行~