ASP.NET Core 模型绑定

news2024/11/19 4:47:49

🍀介绍

在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.coloradmin.cn/o/1573245.html

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

相关文章

《债务与国家的崛起》西方民主制度的金融起源 - 三余书屋 3ysw.net

债务与国家的崛起:西方民主制度的金融起源 你好,今天我们来聊聊由英国知名经济与金融历史学家詹姆斯麦克唐纳所著的《债务与国家的崛起》这本书。19世纪世界历史上发生了一次巨变,即“大分流”。当时西方通过工业革命实现了科技和经济的飞速…

如何保护大模型API安全

大模型的崛起正在改变着我们对机器学习和人工智能的理解,它们不仅提供了令人惊叹的预测和分析能力,还在各行各业的应用中发挥着重要作用。通过提供 API,用户无需了解底层实现细节,使大型模型能够更好地与用户和应用程序进行交互&a…

深度学习相关知识

一.环境配置 1.cuda/cudnn安装: 安装cuda之前首先安装vs,vs版本从低到高安装。 a) 安装cuda:首先查看显卡支持的最高CUDA的版本,以便下载对应的CUDA安装包; cmd命令行:nvidia-smi,显示如下:…

【GPT-4 Turbo】、功能融合:OpenAI 首个开发者大会回顾

GPT-4 Turbo、功能融合:OpenAI 首个开发者大会回顾 就在昨天 2023 年 11 月 6 日,OpenAI 举行了首个开发者大会 DevDay,即使作为目前大语言模型行业的领军者,OpenAI 卷起来可一点都不比同行差。 OpenAI 在大会上不仅公布了新的 …

基于单片机多模式多样式跑马灯系统仿真设计

**单片机设计介绍,基于单片机多模式多样式跑马灯系统仿真设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机多模式多样式跑马灯系统仿真设计是一个集硬件仿真、软件编程和灯光控制于一体的综合性项目。以下是对该设…

Quantinuum与微软携手突破:开创容错量子计算新纪元

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

SystemC入门之测试平台编写完整示例:带同步输出的多路选择器

内容&#xff1a;SystemC入门书中的简单测试平台编写示例。 模块文件编写 带锁存输出的4选1多路器模型。输出在信号clock的正跳变沿时刻被锁存。 sync_mux41.h文件 #include <systemc.h>SC_MODULE(sync_mux41) {sc_in<bool> clock, reset;sc_in<sc_uint<…

【开源语音项目OpenVoice](一)——实操演示

目录 一、前菜 1、Python选择 2、pip源切换 3、ffmpeg配置问题 4、VSCode添加Jupyter扩展 二、配置虚拟环境 1、下载源码 方法一 直接下载源码压缩包 方法二 使用git 1&#xff09;git加入鼠标右键 2&#xff09;git clone源码 2、VSCode出场 1&#xff09;创建pyth…

C#操作MySQL从入门到精通(5)——查询数据

前言 在和MySql数据库交互的过程中,查询数据是使用最频繁的操作,本文详细介绍了查询数据的各种操作,包括查询一列数据、 查询两列数据、查询所有列数据、查询不重复的数据、查询指定行数据,绝对是C#操作MySql数据库史上最详细教程,能够帮助小白快速入门以及将这些功能迅速…

闪站侠洗护管理系统,洗衣洗鞋小程序软件定制,干洗连锁店软件系统搭建;

闪站侠洗护管理系统&#xff0c;洗衣洗鞋小程序软件定制&#xff0c;干洗连锁店软件系统搭建&#xff1b; 为了让每一个洗衣洗鞋工厂与门店的连接更加高效便捷&#xff0c;送洗流程更加简单轻松&#xff0c;拽牛科技倾心打造洗衣洗鞋管理软件。我们的目标是通过高效和优质的服务…

栈的详解和例题(力扣有效括号)

感谢各位大佬的光临&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 收入专栏:初阶数据结构_LaNzikinh篮子的博客-CSDN博客 文章目录 前言一.什么是栈二.栈的实现三.例题&#xff…

爬取学习强国视频小示例

因为需要爬取的视频数量并不是很大&#xff0c;总共需要将131个视频下载下来&#xff0c;所以就直接去手动找找视频的地址和名称保存下来的。由于页面是动态加载的&#xff0c;所以我们无法在网站源码中直接找到视频的超链接。设想是可以用Selenium模拟浏览器点击进行动态加载获…

excel统计分析——多项式回归

参考资料&#xff1a;生物统计学 多项式回归属于单变量曲线回归&#xff0c;但其形式和求解方法与多元线性回归相似。多项式回归的数学模型为&#xff1a; 令&#xff0c;&#xff0c;&#xff0c;&#xff0c;则 由于X不可逆&#xff0c;两边同时乘以X得&#xff0c;&#xff…

《QT实用小工具·十五》多种样式的开关控件

1、概述 源码放在文章末尾 目前实现了三种样式的开关控件按钮&#xff0c;如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef IMAGESWITCH_H #define IMAGESWITCH_H/*** 图片开关控件 * 1. 自带三种开关按钮样式。* 2. 可自定义开关图片。*/#include <QWid…

使用Android完成案例教学

目录 题目&#xff1a;完成在Android平台下2个玩家分别利用2个手机连接在同一局域网下通过滑动摇杆分别使红飞机和黄飞机移动的开发。&#xff08;全代码解析&#xff09; 题目&#xff1a;完成在Android平台下2个玩家分别利用2个手机连接在同一局域网下通过滑动摇杆分别使红飞…

利用native的方式实现跨线程调用

简介 在OpenHarmony应用开发实践中&#xff0c;经常会遇到一些耗时的任务&#xff0c;如I/O操作、域名解析以及复杂计算等。这些任务如果直接在主线程中执行&#xff0c;将会严重阻塞主线程&#xff0c;影响后续任务的正常流程&#xff0c;进而导致用户界面响应延迟甚至卡顿。…

基于沙漏 Tokenizer 的高效三维人体姿态估计框架HoT

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;基于沙漏 Tokenizer 的高效三维人体姿态估计框架HoT1、研究背景2、提出方法3、模块详细3.1、什么是HoT3.2、HoT 框架3.3、Token 剪…

JS 利用 webcam访问摄像头 上传到服务器

webcam JS 较为详细的指南 定义标题 <!doctype html> <html> <head><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>How to capture picture from webcam with Webcam.js</title></…

【UnityRPG游戏制作】Unity_RPG项目之界面面板分离和搭建

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

计算机视觉——基于傅里叶幅度谱文档倾斜度检测与校正

概述 在计算机视觉领域&#xff0c;处理文档数据时&#xff0c;OCR算法的性能往往会受到文档的倾斜度影响。如果文档在输入到模型之前没有经过恰当的校正&#xff0c;模型就无法期待模型能够提供准确的预测结果&#xff0c;或者模型预测的精度会降低。例如&#xff0c;在信息提…