ASP.NET MVC – 模型

ASP.NET MVC 中的 Model(模型) 是整个项目的“心脏”,它负责三件事:

  1. 定义数据结构(和数据库表对应)
  2. 业务规则与验证
  3. 在 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 数据库 + 模型 + 控制器 + 视图 + 完整后台,我全部都可以直接发你现成的,随时说一声就行~

文章已创建 2965

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部