ASP.NET Core 模型绑定

🍀介绍

在C#中,特别是在ASP.NET Core中,模型绑定是一个将HTTP请求中的数据映射到C#对象的过程。它使得开发者能够方便地从请求中提取数据,而无需手动解析请求体、查询字符串、路由数据等。ASP.NET Core提供了多种特性(Attributes)来指定模型绑定的来源。以下是一些常用的模型绑定特性及其区别:

[FromRoute]

  • 适用于:路由模板中的参数。
  • 描述:从路由模板中绑定数据到模型对象。
  • 示例:对于路由模板api/items/{id},你可以使用[FromRoute]来绑定id参数。

[FromQuery]

  • 适用于:查询字符串中的数据。
  • 描述:从URL的查询字符串中绑定数据到模型对象。
  • 示例:对于URL https://example.com/api/items?page=1&size=10,你可以使用[FromQuery]来绑定pagesize参数。

[FromHeader]

  • 适用于:HTTP请求头中的数据。
  • 描述:从HTTP请求头中绑定数据到模型对象或单个属性。
  • 示例:可以用来绑定如AuthorizationContent-Type等请求头。

[FromBody]

  • 适用于:POST、PUT等请求的请求体数据。
  • 描述:将请求体中的数据绑定到模型对象。通常用于JSON或XML格式的数据。
  • 注意事项:在一个动作方法中,通常只能有一个参数使用[FromBody],因为请求体只能被读取一次。

[FromForm]

  • 适用于:表单提交的数据。。
  • 描述:在ASP.NET Core Web API中,[FromForm]特性用于从HTTP请求的表单数据中绑定数据到模型对象。这通常用于处理multipart/form-data类型的请求,比如文件上传同时携带其他表单字段的场景。
  • 示例:假设你有一个Web API端点,用于接收用户上传的图片以及其他相关信息,你可以使用[FromForm]来绑定表单数据。

[FromServices]

  • 适用于:依赖注入的服务。
  • 描述:不是直接从请求中绑定数据,而是从依赖注入容器中获取服务实例。
  • 示例:常用于注入如ILoggerDbContext等服务。

[ModelBinder]

  • 适用于:自定义模型绑定逻辑。
  • 描述:允许你创建自定义的模型绑定逻辑。你可以通过实现IModelBinder接口或继承IModelBinderProvider来创建自定义的模型绑定器。

 🍀演示

下面我们对上面提到的模型绑定特性对常用的几个进行使用演示

因为在Get请求中不能有body,因此我们先在get方法中演示前面三种模型绑定特性[FromRoute]、[FromQuery] 和 [FromHeader] 

简单来说 [FromRoute]就是从数据路由中获取值[FromQuery] 从查询字符串中获取值[FromHeader] 从HTTP标头中获取值

🐳FromRoute、FromQuery、FromHeader

新建一个asp.net core项目,在controller中使用这三个标签

using Microsoft.AspNetCore.Mvc;namespace testWebApi.Controller;[ApiController]
[Route("api/[controller]")]
public class TestController:ControllerBase
{[HttpGet][Route("Getoption/{id}")]public IActionResult Getoption([FromRoute]int id,[FromQuery] string query,[FromHeader] string header){return Ok($@"route:{id},query:{query},header:{header}");}
}

启动项目,我们在swagger中请求测试一下

F12在网络请求情况中可以得知,route和query都在请求URL中,而header顾名思义,在我们的请求头中。

🐳FromForm

接下来我们在controller中增加一个post请求的方法,使用FromForm形似绑定数据

    [HttpPost][Route("testForm")]public IActionResult TestForm([FromForm] int id, [FromForm] string name){return Ok(@$"Id:{id}, Name:{name}");}

这里我们使用postman演示一下 

🐤文件上传

FromForm我们通常用于文件上传,如下将参数类型改为IFormFile

    [HttpPost][Route("upload")]public IActionResult UploadFile([FromBody] IFormFile file){return Ok();}

 在postman中上传文件测试一下,注意这里的key要和参数名(这里是 file)对应上

在file实例中我们可以看到他的文件名称,类型等信息。

🐳FromBody

要注意的是,在一个动作方法中,通常只能有一个参数使用[FromBody],因为请求体只能被读取一次。

    [HttpPost][Route("testBody")]public IActionResult TestBody([FromBody] string name){return Ok(name);}

post请求的方法体我们一般是使用json数据格式。

🐤对象模式绑定

因为请求体只能读取一次,要获取多个数据我们一般采用对象模式来进行模型绑定,首先创建一个Dto

public class Student
{public int Id { get; set; }public string? Name { get; set; }
}

 然后在方法参数中将Dto设置为参数

    [HttpPost][Route("testBody")]public IActionResult TestBody([FromBody] Student student){return Ok(@$"Id:{student.Id}, Name:{student.Name}");}

请求测试!

 注意我们的数据一定要遵守JSON数据的格式,如果对JSON数据格式不熟悉我们可以通过下面的在线JSON校验格式工具进行数据的检查。

在线JSON校验格式化工具(Be JSON)

 

事实上在上面说的的query,route,form,body,header这五种来源都可以使用这种对象现实来进行数据绑定,但是一般数据比较多的话我们通常选择将它放到post请求的body中

🐳模型验证

在使用对象模式进行模型绑定时,可以像如下通过一些标签来对我们要绑定的数据进行校验,如添加 [Required] 将这个参数设置为非空,然后 [Range(1,100)]设置我们的id取值只能在1-100之间,同时通过ErrorMessage(可选)来自定义我们的错误提示。

public class Student
{[Required][Range(1,100,ErrorMessage = "只能传1-100的值!")]public int Id { get; set; }public string? Name { get; set; }
}

这些都是.netCore内置的验证特性,以下是一些内置验证特性:

  • [ValidateNever]:指示应将某一属性或参数排除在验证外。
  • [CreditCard]:验证属性是否有信用卡格式。 需要 jQuery Validation 附加方法。
  • [Compare]:验证模型中的两个属性是否匹配。
  • [EmailAddress]:验证属性是否有电子邮件格式。
  • [Phone]:验证属性是否有电话号码格式。
  • [Range]:验证属性值是否在指定范围内。
  • [RegularExpression]:验证属性值是否与指定的正则表达式匹配。
  • [Required]:验证字段是否不为 null。 请参阅 [Required] 属性,获取关于该特性的行为的详细信息。
  • [StringLength]:验证字符串属性值是否未超过指定长度限制。
  • [Url]:验证属性是否有 URL 格式。
  • [Remote]:通过调用服务器上的操作方法,验证客户端上的输入。 请参阅 [Remote] 属性,获取关于该特性的行为的详细信息。

 关于更详细的其他内置验证特性,我们可以在官方文档中进行查阅👇

ASP.NET Core MVC 中的模型验证 | Microsoft Learn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第13题罗马数字转整数

题解: 题解: int romanToInt(char* s) {int symbolValues[26];symbolValues[I - A] 1;symbolValues[V - A] 5;symbolValues[X - A] 10;symbolValues[L - A] 50;symbolValues[C - A] 100;symbolValues[D - A] 500;symbolValues[M - A] 1000;int a…

春招百题--堆

一、堆的定义 二、堆(优先队列) 堆通常用于实现优先队列(priority_queue),大顶堆相当于元素按从大到小的顺序出队的优先队列。从使用角度来看,我们可以将“优先队列”和“堆”看作等价的数据结构。 堆的…

【算法-数组】二分查找法

这里写自定义目录标题 一、二分查找法是什么?二、二分查找法易错点三、如何解决上述提到的问题四、左闭右闭写法五、左闭右开写法 一、二分查找法是什么? 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,返回target在数…

迷茫下是自我提升

长夜漫漫,无心睡眠。心中所想,心中所感,忧愁当前,就执笔而下,写下这篇文章。 回忆过往 回想当初为啥学前端,走前端这条路,学校要求嘛,兴趣爱好嘛,还是为了钱。 时间带着…

爬虫 新闻网站 以湖南法治报为例(含详细注释,控制台版) V3.0 升级 自定义查询关键词、时间段、粗略判断新闻是否和优化营商环境相关,避免自己再一个个判断

目标网站:湖南法治报 爬取目的:为了获取某一地区更全面的在湖南法治报的已发布的和优化营商环境相关的宣传新闻稿,同时也让自己的工作更便捷 环境:Pycharm2021,Python3.10, 安装的包:requests&a…

【微信小程序】【小程序样式加载不出来】

微信小程序配置sass 第一步:找配置文件 在项目中找到 project.config.json文件,在setting属性中添加 useCompilerPlugins属性,值为sass即可,若是 less,将数组里面的值改为less即可 "useCompilerPlugins": ["sas…

HAL STM32主从定时器联级使用

HAL STM32主从定时器联级使用 具体介绍参考STM32参考手册 🌿主从定时器联级:使用一个定时器作为另一个定时器的预分频器。 🍁时钟关系: 🌿TIM1 和TIM8 控制寄存器 2(TIMx_CR2)相关位: 🔖主…

需求工程

对象类(实体类、边界类、控制类)抽象封装继承与泛化多态接口消息组件模式和复用 设计原则 单一职责原则:设计目的单一的类开放封闭原则:对扩展开放,对修改封闭李氏(Liskov)替换原则:子类可以替换父类依赖…

效率系列(十) macOS软件管理工具

大家好,我是半虹,这篇文章来讲 macOS 上的软件管理工具 Homebrew 1、简介 Homebrew 是 macOS 上的包管理器,用户可以通过简单的命令行工具安装和管理软件包 Homebrew 在安装软件时能自动处理依赖问题,简化软件包的安装流程&…

每日OJ题_优先级队列_堆④_力扣295. 数据流的中位数

目录 力扣295. 数据流的中位数 解析代码 力扣295. 数据流的中位数 295. 数据流的中位数 难度 困难 中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。例如 arr…

AI大语言模型GPT —— R 生态环境领域数据统计分析

自2022年GPT(Generative Pre-trained Transformer)大语言模型的发布以来,它以其卓越的自然语言处理能力和广泛的应用潜力,在学术界和工业界掀起了一场革命。在短短一年多的时间里,GPT已经在多个领域展现出其独特的价值…

电商技术揭秘八:搜索引擎中的SEO内部链接建设与外部推广策略

文章目录 引言一、 内部链接结构优化1.1 清晰的导航链接1. 简洁明了的菜单项2. 逻辑性的布局3. 避免深层次的目录结构4. 使用文本链接5. 突出当前位置6. 移动设备兼容性 1.2 面包屑导航1. 显示当前页面位置2. 可点击的链接3. 简洁性4. 适当的分隔符5. 响应式设计6. 避免重复主页…

Windows11下Docker使用记录(二)

Docker使用记录(二) 1. 常用指令2. Dockerfile示例3. 构建docker image Docker中container,image,dockerfile 以及docker hub的关系如图所示,详细可见上一篇帖子。 本文主要记录Dockerfile相关。 1. 常用指令 常用指令…

索引总结(2)

013 为什么官方建议使用自增长主键作为索引?(说一下自增主键和字符串类型主键的区别和影响) 自增主键能够维持底层数据顺序写入读取可以由b树的二分查找定位支持范围查找,范围数据自带顺序 字符串无法完成以上操作 014 使用int…

vue3从精通到入门13:组件的传参方式

组件传参主要通过 props、emits、slots、provide/inject 以及 setup 函数中的 context 来实现。当使用 <script setup> 语法时&#xff0c;传参方式会更加简洁和直观。 1. props props 是父组件向子组件传递数据的主要方式。我们可以使用 defineProps 函数来声明 props…

沐瞳科技一面 客户端开发(45min)

自我介绍 Unity编译方式&#xff08;Mono与IL2CPP区别&#xff09; C#值类型和引用类型的区别 ref和out参数区别 C#装拆箱 C#委托与接口 Unity项目问答 合批了解吗 行为树与状态机的差异 对象池实现 对象池解决了什么问题 熟悉哪些设计模式 观察者模式讲讲 事件管…

重装系统之后,电脑连网卡都没反应怎么办?

前言 有些电脑比较奇葩&#xff0c;安装完成之后会出现网卡连驱动都没有&#xff0c;这时候要安装电脑驱动可是真的烦躁。怎么下手呢&#xff1f; 如果确定电脑的网卡型号还好&#xff0c;直接找个电脑下载个对应的网卡驱动&#xff0c;用U盘复制过去就能安装。 但如果不知道…

内网安全之域内密码喷洒

域内密码喷洒一般和域内用户名枚举一起使用&#xff0c;可以在无域内凭据的情况下&#xff0c;通过枚举出域内存在的用户名&#xff0c;进而对域内存在的用户名进行密码喷洒&#xff0c;以此来获得域内有效凭据。 在Kerberos协议认证的AS-REQ阶段&#xff0c;请求包cname对应的…

构建一个基于IIoT的智能工厂

构建一个基于工业物联网&#xff08;IIoT&#xff09;的智能工厂涉及到多个方面的技术和管理策略。以下是构建智能工厂的关键步骤和考虑因素&#xff1a; 需求分析与规划&#xff1a; 首先&#xff0c;需要对现有的生产流程进行深入分析&#xff0c;确定哪些环节可以通过IIoT技…

排序算法-堆排序

1.什么是堆 堆是一种特殊的数据结构&#xff0c;它是一种二叉树&#xff0c;其中每个节点都具有一个值并且满足以下两个条件&#xff1a; 堆是完全二叉树&#xff1a;除了最底层的叶节点外&#xff0c;其他层都是满的&#xff0c;并且最底层的叶节点都尽量靠左排列。堆中每个…