当前位置: 首页 > article >正文

.NET8入门:14.ASP.NET Core MVC进阶——Model

上一篇文章我们了解了一下MVC在ASP.NET8中的一些基础概念,接下来深入了解一下ASP.NET Core MVC中Model的一些特性和用法。

Model

职责

Model 代表应用程序的核心数据和业务逻辑部分。它负责:
  • 封装业务数据:表示应用程序中的实体,如用户、订单、商品等。
  • 处理业务逻辑:包含数据验证、计算、规则判断等。
  • 与数据存储交互:通过 ORM(如 Entity Framework Core)或其他方式访问数据库。
  • 为视图提供数据:将处理后的数据传递给视图进行展示。

类型

在 ASP.NET Core MVC 中,Model 主要有三种类型:领域模型、视图模型和绑定模型。
领域模型(Domain Model)
  • 代表业务实体和核心业务逻辑。
  • 通常对应数据库中的表结构。
  • 例如:UserProductOrder 类。
  • 领域模型通常包含属性、方法和业务规则。
视图模型(ViewModel)
  • 专门为视图设计的数据结构。
  • 只包含视图需要展示或输入的数据。
  • 解决领域模型与视图需求不匹配的问题。
  • 例如:UserViewModel 可能只包含用户名和邮箱,而不包含密码等敏感信息。
  • 视图模型有助于减少视图与领域模型的耦合。
绑定模型(Binding Model)
  • 用于接收用户输入的数据模型。
  • 通过模型绑定(Model Binding)机制,将请求数据绑定到该模型。
  • 通常与视图模型合并使用。

设计原则

  • 单一职责:每个模型类应专注于特定业务领域或视图需求。
  • 数据验证:利用数据注解(Data Annotations)或自定义验证逻辑,确保数据合法。
  • 解耦视图和业务逻辑:通过视图模型隔离视图和领域模型,避免直接暴露数据库实体。
  • 可测试性:设计清晰的模型有助于单元测试业务逻辑。

示例

下面通过一个图书管理系统中图书的增删改查来帮助我们深入了解和学习Model的实际用法。
领域模型(Domain Model)
领域模型代表数据库实体和核心业务逻辑。
// Models/Book.cs
using System;namespace YourNamespace.Models
{// 单一职责:领域模型只负责业务逻辑public class Book{public int Id { get; set; }  // 主键public string Title { get; set; }public string Author { get; set; }public DateTime PublishDate { get; set; }public decimal Price { get; set; }// 业务逻辑:判断是否经典public bool IsClassic(){return (DateTime.Now - PublishDate).TotalDays > 3650;}}
}

视图模型(ViewModel)
视图模型专门为视图设计,包含视图需要展示的数据,可能是领域模型的子集或扩展。
// Models/ViewModels/BookViewModel.cs
using System;namespace YourNamespace.Models.ViewModels
{// 单一职责:视图模型只负责展示数据格式化public class BookViewModel{public int Id { get; set; }public string Title { get; set; }public string Author { get; set; }//根据Book的数据来对下面这些值进行赋值public string PublishDateString { get; set; }  // 格式化后的日期字符串public string PriceString { get; set; }        // 格式化后的价格字符串public string ClassicStatus { get; set; }      // 是否经典的文字描述}
}

绑定模型(Binding Model)
绑定模型用于接收用户输入,通常用于表单提交,包含验证特性。
// Models/BindingModels/BookCreateModel.cs
using System;
using System.ComponentModel.DataAnnotations;namespace YourNamespace.Models.BindingModels
{// 单一职责:专注于接收用户输入和验证,保证数据安全和完整。public class BookCreateModel{[Required(ErrorMessage = "书名不能为空")][StringLength(100, MinimumLength = 2, ErrorMessage = "书名长度应在2到100字符之间")]public string Title { get; set; }[Required(ErrorMessage = "作者不能为空")][StringLength(50)]public string Author { get; set; }[Required(ErrorMessage = "出版日期不能为空")][DataType(DataType.Date)]public DateTime PublishDate { get; set; }[Range(0.01, 1000, ErrorMessage = "价格必须在0.01到1000之间")]public decimal Price { get; set; }}
}

控制器
这三种模型分别在控制器中的使用方式请查看下面代码示例:
// Controllers/BooksController.cs
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using YourNamespace.Models;
using YourNamespace.Models.ViewModels;
using YourNamespace.Models.BindingModels;namespace YourNamespace.Controllers
{public class BooksController : Controller{private static List<Book> books = new List<Book>{new Book { Id = 1, Title = "ASP.NET Core 入门", Author = "张三", PublishDate = new DateTime(2015, 5, 1), Price = 59.9m },new Book { Id = 2, Title = "C# 高级编程", Author = "李四", PublishDate = new DateTime(2010, 3, 15), Price = 79.9m },new Book { Id = 3, Title = "设计模式精解", Author = "王五", PublishDate = new DateTime(2000, 7, 20), Price = 99.9m }};// 显示图书列表,使用视图模型public IActionResult Index(){var viewModels = books.Select(b => new BookViewModel{Id = b.Id,Title = b.Title,Author = b.Author,PublishDateString = b.PublishDate.ToString("yyyy-MM-dd"),PriceString = b.Price.ToString("C"),ClassicStatus = b.IsClassic() ? "是" : "否"}).ToList();return View(viewModels);}// 显示图书详情,使用视图模型public IActionResult Details(int id){var book = books.Find(b => b.Id == id);if (book == null)return NotFound();var viewModel = new BookViewModel{Id = book.Id,Title = book.Title,Author = book.Author,PublishDateString = book.PublishDate.ToString("yyyy-MM-dd"),PriceString = book.Price.ToString("C"),ClassicStatus = book.IsClassic() ? "是" : "否"};return View(viewModel);}// 显示创建表单,GET 请求[HttpGet]public IActionResult Create(){return View();}// 处理创建表单提交,POST 请求,使用绑定模型[HttpPost]public IActionResult Create(BookCreateModel model){if (!ModelState.IsValid){return View(model);}// 将绑定模型转换为领域模型var newBook = new Book{Id = books.Max(b => b.Id) + 1,Title = model.Title,Author = model.Author,PublishDate = model.PublishDate,Price = model.Price};books.Add(newBook);return RedirectToAction(nameof(Index));}}
}

视图
视图模型模型在视图中的使用方式请查看下面代码示例:
@model IEnumerable<YourNamespace.Models.ViewModels.BookViewModel><h2>图书列表</h2><table border="1" cellpadding="5"><tr><th>书名</th><th>作者</th><th>出版日期</th><th>价格</th><th>是否经典</th><th>操作</th></tr>@foreach (var book in Model){<tr><td>@book.Title</td><td>@book.Author</td><td>@book.PublishDateString</td><td>@book.PriceString</td><td>@book.ClassicStatus</td><td><a asp-action="Details" asp-route-id="@book.Id">详情</a></td></tr>}
</table><p><a asp-action="Create">添加新书</a></p>

使用场景

通过上面的描述和代码示例总结出三种模型的使用场景和区别:

模型类型

作用

适用场景

说明

领域模型

代表业务实体和业务逻辑,映射数据库结构

业务核心层,数据持久化,业务规则封装

直接反映业务对象,包含业务方法,如 IsClassic()

视图模型

专门为视图设计,包含视图需要展示的数据

视图展示层,数据格式化、组合,避免视图直接依赖领域模型

只包含视图需要的字段,格式化数据,减少视图与领域模型耦合

绑定模型

用于接收和验证用户输入的数据

控制器接收表单提交,数据验证,防止非法输入

包含数据验证特性,确保输入合法,通常是表单对应的模型

相关文章:

.NET8入门:14.ASP.NET Core MVC进阶——Model

上一篇文章我们了解了一下MVC在ASP.NET8中的一些基础概念&#xff0c;接下来深入了解一下ASP.NET Core MVC中Model的一些特性和用法。 Model 职责 Model 代表应用程序的核心数据和业务逻辑部分。它负责&#xff1a; 封装业务数据&#xff1a;表示应用程序中的实体&#xff0c;…...

latex figure Missing number, treated as zero. <to be read again>

\begin{figure}[h] \centering \includegraphics[width\linewidth]{pictures/architecture.pdf} \caption{Typical architecture.} \label{fig:architecture} \end{figure}&#xff0c; 我在编译latex&#xff0c;这段代码报错&#xff0c; Missing number, treated …...

java CompletableFuture创建异步任务(Completable异步+ExecutorService线程池)

文章目录 前置自定义线程池使用 CompletableFuture 创建异步任务 前置 来自 import java.util.concurrent.CompletableFuture; 自定义线程池 推荐根据业务需求配置 ExecutorService pool new ThreadPoolExecutor(10, // 核心线程数20, // 最大线程数60L, TimeUnit.SECONDS…...

LeetCode 高频 SQL 50 题(基础版)之 【聚合函数】部分

题目&#xff1a;620. 有趣的电影 题解&#xff1a; select * from cinema where description !boring and id%21 order by rating desc题目&#xff1a;1251. 平均售价 题解&#xff1a; select p.product_id product_id,round(ifnull(sum(p.price*u.units)/sum(u.units),0)…...

【AI学习】检索增强生成(Retrieval Augmented Generation,RAG)

1&#xff0c;介绍 出自论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》&#xff0c;RAG是权宜之计&#xff0c;通过RAG将问题简单化、精简化、剔除噪声&#xff0c;让LLM更容易理解、生成内容。RAG&#xff1a;检索增强技术检索生成&#xff08;重…...

低成本高效图像生成:GPUGeek和ComfyUI的强强联合

一、时代背景 在如今的数字化时代&#xff0c;图像生成技术正不断发展和演变&#xff0c;尤其是在人工智能领域。无论是游戏开发、虚拟现实&#xff0c;还是设计创意&#xff0c;图像生成已成为许多应用的核心技术之一。然而&#xff0c;随着图像质量需求的提升&#xff0c;生成…...

基于Matlab实现卫星轨道模拟仿真

在IT行业中&#xff0c;卫星轨道模拟和仿真程序是航空航天领域的重要工具&#xff0c;用于预测和分析人造卫星的运动轨迹。 我们需要理解卫星轨道的基本原理。地球引力使得卫星围绕地球运动&#xff0c;形成特定的椭圆或圆形轨道。牛顿的万有引力定律和开普勒的行星运动定律为…...

前端使用 spark-md5 实现大文件切片上传

需要计算文件MD5和、分片MD5&#xff1a; 封装公共方法代码如下&#xff1a; import SparkMD5 from "spark-md5"/*** 计算文件MD5* param file* returns*/ export function calculateFileMD5(file) {return new Promise((resolve) > {const reader new FileRea…...

《操作系统真相还原》——进入内核

ELF 按书上的操作来&#xff0c;在现代操作平台编译链接默认生成elf64 格式的文件&#xff0c; 很显然程序头位置发生变化&#xff0c;因为定义elf 结构的类型中有64位&#xff0c;所以我们需要将编译链接出32位格式的 gcc -m32 -c -o main.o main.c ld -m elf_i386 main.o …...

【QQ音乐】sign签名| data参数 | AES-GCM加密 | webpack(上)

1.目标 网址&#xff1a;https://y.qq.com/n/ryqq/toplist/26 切换榜单出现请求&#xff0c;可以看到sign和data是加密的 2.逆向分析 搜索sign: 可以看到sign P(n.data)&#xff0c;而n.data就是请求的加密data参数 data {"comm":{"cv":4747474,&qu…...

【STM32】按键控制LED 光敏传感器控制蜂鸣器

&#x1f50e;【博主简介】&#x1f50e; &#x1f3c5;CSDN博客专家 &#x1f3c5;2021年博客之星物联网与嵌入式开发TOP5 &#x1f3c5;2022年博客之星物联网与嵌入式开发TOP4 &#x1f3c5;2021年2022年C站百大博主 &#x1f3c5;华为云开发…...

M-OFDM模糊函数原理及仿真

文章目录 前言一、M序列二、M-OFDM 信号1、OFDM 信号表达式2、模糊函数表达式 三、MATLAB 仿真1、MATLAB 核心源码2、仿真结果①、m-OFDM 模糊函数②、m-OFDM 距离分辨率③、m-OFDM 速度分辨率④、m-OFDM 等高线图 四、资源自取 前言 本文进行 M-OFDM 的原理讲解及仿真&#x…...

【MySQL】MVCC与Read View

目录 一、数据库并发的三种场景 二、读写场景的MVCC &#xff08;一&#xff09;表中的三个隐藏字段 &#xff08;二&#xff09;undo 日志 &#xff08;三&#xff09;模拟MVCC &#xff08;四&#xff09;Read View &#xff08;五&#xff09;当前读和快照读 三、RC和…...

相机--双目立体相机

教程 链接1 教程汇总 立体匹配算法基础概念 视频讲解摄像机标定和双目立体原理 两个镜头。 双目相机也叫立体相机--Stereo Camera&#xff0c;属于深度相机。 作用 1&#xff0c;获取图像特征&#xff1b; 2&#xff0c;获取图像深度信息&#xff1b; 原理 原理和标定 …...

多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现

多目标粒子群优化算法&#xff08;MOPSO&#xff09;&#xff0c;用于解决无人机三维路径规划问题&#xff0c;Matlab代码实现 目录 多目标粒子群优化算法&#xff08;MOPSO&#xff09;&#xff0c;用于解决无人机三维路径规划问题&#xff0c;Matlab代码实现效果一览基本介绍…...

工厂模式 vs 策略模式:设计模式中的 “创建者” 与 “决策者”

在日常工作里&#xff0c;需求变动或者新增功能是再常见不过的事情了。而面对这种情况时&#xff0c;那些耦合度较高的代码就会给我们带来不少麻烦&#xff0c;因为在这样的代码基础上添加新需求往往困难重重。为了保证系统的稳定性&#xff0c;我们在添加新需求时&#xff0c;…...

23、Swift框架微调实战(3)-Qwen2.5-VL-7B LORA微调OCR数据集

一、模型介绍 Qwen2.5-VL 是阿里通义千问团队开源的视觉语言模型,具有3B、7B和72B三种不同规模,能够识别常见物体、分析图像中的文本、图表等元素,并具备作为视觉Agent的能力。 Qwen2.5-VL 具备作为视觉Agent的能力,可以推理并动态使用工具,初步操作电脑和手机。在视频处…...

37. Sudoku Solver

题目描述 37. Sudoku Solver 回溯 class Solution {vector<vector<bool>> row_used;vector<vector<bool>> col_used;vector<vector<bool>> box_used;public:void solveSudoku(vector<vector<char>>& board) {row_used.r…...

C# Renci.SshNet 登陆 suse配置一粒

C# 调用Renci.SshNet 的SSH类库&#xff0c;登陆 suse linux系统&#xff0c;如果没有配置&#xff0c;会报错&#xff1a; Renci.SshNet.Common.SshAuthenticationException: No suitable authentication method found to complete 1、需要root登陆os,配置 /etc/ssh/sshd_con…...

RV1126-OPENCV 图像叠加

一.功能介绍 图像叠加&#xff1a;就是在一张图片上放上自己想要的图片&#xff0c;如LOGO&#xff0c;时间等。有点像之前提到的OSD原理一样。例如&#xff1a;下图一张图片&#xff0c;在左上角增加其他图片。 二.OPENCV中图像叠加常用的API 1. copyTo方法进行图像叠加 原理…...

修改 vscode 左侧导航栏的文字大小 (更新版)

1. 起因&#xff0c; 目的: 问题&#xff1a; vscode 左侧的文字太小了&#xff01;&#xff01;&#xff01;我最火的一篇文章&#xff0c;写的就是这个问题。 看来这个问题&#xff0c;是很广泛的一个痛点。我最近更新了 vscode&#xff0c; 这个问题又出现了。再来搞一下。…...

从C++编程入手设计模式2——工厂模式

从C编程入手设计模式 工厂模式 ​ 我们马上就要迎来我们的第二个创建型设计模式&#xff1a;工厂方法模式&#xff08;Factory Method Pattern&#xff09;。换而言之&#xff0c;我们希望使用一个这样的接口&#xff0c;使用其他手段而不是直接创建的方式&#xff08;说的有…...

云原生 Cloud Native Build (CNB)使用初体验

云原生 Cloud Native Build&#xff08;CNB&#xff09;使用初体验 引言 当“一切皆可云”成为趋势&#xff0c;传统开发环境正被云原生工具重塑。腾讯云CNB&#xff08;Cloud Native Build&#xff09;作为一站式开发平台&#xff0c;试图解决多环境协作难题。 本文将分享c…...

格式工厂 FormatFactory v5.20.便携版 ——多功能媒体文件转换工具 长期更新

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORWF3Q7D0eCVV06LHbzheD-A1?pwdjikz# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/8ee59ed83658 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…...

数据可视化--使用matplotlib绘制高级图表

目录 一、绘制等高线图 contour() 二、绘制矢量场流线图 streamplot() 三、绘制棉棒图 stem() 四、绘制哑铃图 五、绘制甘特图 六、绘制人口金字塔图 barh() 七、绘制漏斗图 简易版漏斗图 八、绘制桑基图 Sankey()---创建桑基图 add()---添加桑基图的选项 finish()…...

卷积神经网络(CNN)完全指南:从原理到实战

卷积神经网络(CNN)完全指南&#xff1a;从原理到实战 引言&#xff1a;为什么CNN改变了计算机视觉&#xff1f; 2012年&#xff0c;AlexNet在ImageNet竞赛中以压倒性优势获胜&#xff0c;将错误率降低了近10个百分点&#xff0c;这标志着卷积神经网络(CNN)时代的开始。如今&a…...

如何做好一个决策:基于 Excel的决策树+敏感性分析应用

决策点: 开发新产品? (是 / 否) 因素 (如果是): 市场接受度 (高 / 中 / 低);概率: 高(0.3), 中(0.5), 低(0.2) 结果值 (NPV): 高(+$1M), 中(+$0.2M), 低(-$0.5M) 不开发成本/收益: $0 开发计算: EMV(市场接受度) = (0.3 * 1M) + (0.5 * 0.2M) + (0.2 * -0.5M) = $0.3M + $…...

【模拟电子电路-工具使用】

模拟电子电路-工具使用 ■ 1. 模拟软件■ 1. circuit JS ■ 2. 万用表■ 3. 示波器■ 4.■ 5.■ 6.■ 7. ■ 1. 模拟软件 ■ 1. circuit JS ■ 2. 万用表 ■ 3. 示波器 ■ 4. ■ 5. ■ 6. ■ 7....

[ElasticSearch] ElasticSearch的初识与基本操作

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

Spring AI 代理模式(Agent Agentic Patterns)

一、Agentic Patterns 核心思想 根据Anthropic《构建高效代理》研究报告&#xff0c;高效LLM代理的设计应遵循两大核心原则&#xff1a; 简单性优先&#xff1a;避免过度设计&#xff0c;从最简单的解决方案开始可组合性&#xff1a;通过模块化设计实现灵活组合而非复杂框架 …...