ASP.NET Core MVC 从入门到精通之自动映射(二)

news2024/11/29 20:58:57

随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。

经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启动运行,以及命名约定,创建控制器,视图,模型,接收参数,传递数据ViewData,ViewBag,路由,页面布局,wwwroot和客户端库,Razor语法,EnityFrameworkCore与数据库,HttpContext,Request,Response,Session,序列化,文件上传,自动映射等内容,今天继续讲解ASP.NET Core MVC 中自动映射第二部分等相关内容,仅供学习分享使用。

经过上一篇文章的讲解,已经对ASP.NET Core中进行自动映射,有了一个初步的了解,今天继续接着上一篇文章对自动映射的第二部分内容进行讲解。

字符替换

在实际开发中,如果映射源存在一些特殊字符【如:ë ,Ă等】,映射目标是正常的字符,则需要进行替换,才能映射。如下所示:

var configuration = new MapperConfiguration(c =>
{
    c.ReplaceMemberName("Ä", "A");
    c.ReplaceMemberName("í", "i");
    c.ReplaceMemberName("Airlina", "Airline");
});

进行以上配置之后,会自动将Äbc映射到Abc上,将íng映射到ing上,将AirlinaMark映射到AirlineMark上。

自动映射匹配前缀与后缀

数据源一般都会有固定的风格,如带有前缀,后缀等标识。那么如何将带前缀的属性映射到不带前缀的的属性上呢?

默认情况下,带前缀是无法自动映射的。如下错误示例,映射源有一个前缀s,映射目标没有,则无法进行自动映射。如下:

可以在映射匹配文件中,增加映射前缀RecognizePrefixes("s"),如下所示:

namespace DemoCoreMVC.Profiles
{
    public class AutomapProfile:Profile
    {
        public AutomapProfile()
        {
            RecognizePrefixes("s");
            SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
            DestinationMemberNamingConvention = new PascalCaseNamingConvention();
            //创建映射关系
            CreateMap<StudentViewModel, Student>();
        }
    }
}

经过前缀设置后,则可以进行自动映射,如下所示:

关于映射匹配前缀后缀设置,有以下几点需要注意:

  1. 一般前缀都是具有一定规律的设置,否则有些前缀a,有些前缀b,没有一定的规律,则无法完全匹配。
  2. 后缀通过RecognizePostfixes("s");设置即可,功能测试与前缀一致。
  3. 取消前缀设置ClearPrefixes();就是取消所有的前缀设置列表中设置的前缀。Automapper默认匹配了Get前缀,如果不需要可以清除。

映射控制(不常用)

使用ShouldMapField和ShouldMapProperty控制哪些属性和字段能够被映射

cfg.ShouldMapField = fi => false;
cfg.ShouldMapProperty = pi =>pi.GetMethod != null && (pi.GetMethod.IsPublic || pi.GetMethod.IsPrivate);

默认所有public的field和property都会被map,也会map private 的setter,但是不会map整个property都是internal/private的属性。

列表映射

在实际工作中,列表的应用场景还是比较多的,列表映射也比较常用。如下所示:

[HttpPost]
public IActionResult Add(StudentViewModel studentViewModel)
{
    var listStudents=new List<StudentViewModel>();
    listStudents.Add(studentViewModel);
    var students =  mapper.Map<List<StudentViewModel>,List< Student>>(listStudents);
    studentService.Adds(students);
    return View();
}

经过测试发现,只要映射了元素类型,列表可以自动映射。如下所示:

 AutoMapper默认会自动映射以下类型:

  • IEnumerable
  • IEnumerable<T>
  • ICollection
  • ICollection<T>
  • IList
  • IList<T>
  • List<T>
  • Arrays

这几个集合之间可以相互映射,如:mapper.Map<Source[], IEnumerable<Destination>>(sources);

手动控制映射(不常用)

如果对于完全没有任何规律的映射,如何进行呢?如下两个映射数据类型:
映射源类型:

namespace DemoCoreMVC.ViewModels
{
    public class UserViewModel
    {
        public int UserId { get; set; }

        public string UserName { get; set; }

        public string Mail { get; set; }
    }
}

映射目标类型:

namespace DemoCoreMVC.Models
{
    public class User
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public string Email { get; set; }
    }
}

需要手动配置映射属性列,如下所示:

public class AutomapProfile:Profile
{
    public AutomapProfile()
    {
        RecognizePrefixes("s");
        //RecognizePostfixes("s");
        SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
        DestinationMemberNamingConvention = new PascalCaseNamingConvention();
        //创建映射关系
        CreateMap<StudentViewModel, Student>();
        //ClearPrefixes();

        CreateMap<UserViewModel, User>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(source => source.UserId))
            .ForMember(dest => dest.Name, opt => opt.MapFrom(source => source.UserName))
            .ForMember(dest => dest.Email, opt => opt.MapFrom(source => source.Mail));
    }
}

映射示例

通过手动配置映射列后,就可以实现自动映射,如下所示:

public IActionResult Add(UserViewModel userViewModel)
{

    var user =  mapper.Map<UserViewModel,User>(userViewModel);

    return View();
}

手动映射测试结果如下:

 注意:手动映射主要适用于属性完全不一致,没有前缀,后缀,任何规律可言的属性映射的情况,所以一般不太常用。

嵌套映射

对于复杂的嵌套类型,对象的属性可能是一个复杂引用类型对象。

映射源,其中属性User为类型为UserViewModel的引用类型。如下所示:

namespace DemoCoreMVC.ViewModels
{
    public class EmployeeViewModel
    {
        public int Id { get; set; }

        public UserViewModel User { get; set; }
    }
}

映射目标,其中属性Uer为类型为User的引用类型。如下所示:

namespace DemoCoreMVC.Models
{
    public class Employee
    {
        public int Id { get; set; }

        public User User { get; set; }
    }
}

如果要对应复杂的存在嵌套关系的对象进行映射,则需要对属性类型也进行创建映射关系。如下所示:

CreateMap<UserViewModel, User>()
    .ForMember(dest => dest.Id, opt => opt.MapFrom(source => source.UserId))
    .ForMember(dest => dest.Name, opt => opt.MapFrom(source => source.UserName))
    .ForMember(dest => dest.Email, opt => opt.MapFrom(source => source.Mail));
CreateMap<EmployeeViewModel,Employee>();

在控制器中调用,如下所示:

public IActionResult Add(UserViewModel userViewModel)
{
    EmployeeViewModel employeeViewModel = new EmployeeViewModel() { Id = 1, User = userViewModel };
    var employee = mapper.Map<EmployeeViewModel, Employee>(employeeViewModel);

    return View();
}

运行测试,如下所示:

以上就是ASP.NET Core MVC从入门到精通之自动映射的第二部分的全部内容。

大家也可以参考以下文章连接,讲解的更加详细:https://blog.csdn.net/catshitone/article/details/109840926。

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

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

相关文章

034:Mapbox GL双屏地图联动

第034个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中实现双屏联动功能。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共110行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://…

Redis入门到实战笔记-数据类型

这里写目录标题 SQL与NoSQL关系型数据库&#xff1a;查询方式&#xff1a; 非关联数据库&#xff1a;查询方式&#xff1a; 总结 认识RedisRedis安装远程连接防火墙设置关闭防火墙开启防火墙检查防火墙状态开放指定端口 Redis数据类型和常见命令keysdelEXISTexpired&#xff0c…

day 41:343. 整数拆分;96.不同的二叉搜索树

动态规划 [343. 整数拆分](https://leetcode.cn/problems/integer-break/description/)1. dp数组以及下标名义2. 递归公式3. dp数组如何初始化4. 遍历顺序:遍历i是从前向后遍历&#xff0c;先有dp[i - j]再有dp[i]5. 代码 96.不同的二叉搜索树1. dp数组以及下标名义2. 递归公式…

计组 第二章错题 2.3 浮点数的表示与运算

4.变形补码就是采用双符号位 &#xff0c;不能避免溢出&#xff0c;只是更方便判断是否溢出 5. 9.B 2047:阶码全1表示正无穷 -&#xff08;11-2*(-52&#xff09;) 10.没有想到用移位 10100是20 12.移码看做无符号数 B、无论有无规格化 都要对阶&#xff0c;并没有方便浮…

【Java 多态】面向对象编程の重要概念,多态是什么,附带小案例

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; Java | 从入门到入坟 专属&#xff1a;六月一日 | 儿童节 Java 多态 多态 &#x1f9a0;在继承中实现多态 &#x1f3a1;在接口中实现多态 &#x1f9ff; 多态 &#x1f9a0; Java的多态是指同一个方法在不同的对象上有…

深度剖析数据在内存中的存储(C语言)

[目录] 目录 #数据类型详细介绍 数据类型介绍 整型家族归类&#xff1a; 浮点型家族归类: 构造类型&#xff1a; 指针类型: 空类型: #整型在内存中的存储 #大小端字节序存储 #浮点数在内存中的存储 为什么会这样&#xff1f; 一&#xff1a;不是全0也不是全1 二&…

皮卡丘File Inclusion

1.File Inclusion(文件包含漏洞)概述 文件包含&#xff0c;是一个功能。在各种开发语言中都提供了内置的文件包含函数&#xff0c;其可以使开发人员在一个代码文件中直接包含&#xff08;引入&#xff09;另外一个代码文件。 比如 在PHP中&#xff0c;提供了&#xff1a; incl…

day 42:01背包问题;416. 分割等和子集

动态规划:01背包问题 01背包问题基础1. 暴力解法2. 二维dp数组01背包1.确定dp数组以及下标的含义2.递推公式3.dp数组如何初始化4.遍历顺序5.测试代码 01背包理论基础&#xff08;滚动数组&#xff09;&#xff1a;将二维dp转换为一维dp1. dp数组以及下标名义2. 递归公式3. dp数…

day 45:爬楼梯进阶版;322. 零钱兑换;279. 完全平方数

爬楼梯进阶版 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 一步一个台阶&#xff0c;两个台阶&#xff0c;三个台阶&#xff0c;…&#xff0c;直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢&#xff1f; 1. dp数组以及下标名义 dp[j]&#xff1a;爬到…

《商用密码应用与安全性评估》第四章密码应用安全性评估实施要点4.5密码应用安全性评估测评工具

目录 测评工具使用和管理要求 测评工具体系 通用测评工具 专用测评工具 典型测评工具概述 测评工具使用和管理要求 测评过程中使用的专用测评工具应通过国家密码管理局的审批或者经检测认证合格。为确保工具测试结果的准确可信&#xff0c;测评机构应确认使用的专用工具是最…

chatgpt赋能python:Python删除离群值

Python 删除离群值 介绍 离群值是指在数据集中远离其他观测值的数据点&#xff0c;可以是数据输入或数据损坏产生的错误。它们通常会对分析造成影响&#xff0c;因此需要处理它们。 Python 是一种流行的编程语言&#xff0c;可以用于处理数据集和删除离群值。本文将介绍 Pyt…

天然气网络潮流计算模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

# Anolis OS8 磁盘扩容

Anolis OS8 磁盘扩容 最近学习的时候&#xff0c;使用Vmware安装了AnolisOS8进行测试&#xff0c;随着学习的深入&#xff0c;组件安装越来越多&#xff0c;磁盘不够用了&#xff0c;但是安装的组件又太多&#xff0c;重新装个虚拟机又得重新装各种组件。所以决定对磁盘进行扩…

Payroll工资单中英文对照明细

不知道大家的工资单是中文的还是英文的&#xff0c;如果是英文的&#xff0c;刚开始看有些看不懂&#xff08;我就是&#xff09;&#xff0c;那么可以在这里找到对应的翻译。如果中文的&#xff0c;而你又想知道对应英文怎么写的话&#xff0c;也欢迎查阅以下表格。ps.个人所得…

网络协议分析(结合版)

初始协议 1.什么是协议&#xff1f; 数据从源地点传输到目的地点&#xff0c;网络上所有设备需要“讲”相同的“语言”。 描述网络通信中如何规范使用“语言” 的一组规则就是协议。 2.数据通信协议: 决定数据的格式和数据的传输的一组规则或者一组惯例 协议分层 ARP协议 …

chatgpt赋能python:Python升降序排列数字

Python升降序排列数字 在Python编程中&#xff0c;排序是一个非常常见并且重要的操作。Python提供了多种排序算法以满足不同的需求。 排序算法 Python中内置的排序算法有两种&#xff1a;Timsort和Quicksort。其中Timsort是一种混合排序算法&#xff0c;结合了插入排序和归并…

使用OpenAI创建对话式聊天机器人

引言 在当今的技术世界中&#xff0c;人工智能&#xff08;AI&#xff09;的发展迅猛&#xff0c;为我们带来了许多令人兴奋的创新。其中&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域的进展使得开发对话式聊天机器人成为可能。OpenAI是一家领先的人工智能研究实验…

【极海APM32F4xx Tiny】学习笔记04-移植FreeRTOS

4.移植FreeRTOS 程序移植的代码&#xff1a; 移植方法和stm32一样的哦 模板工程 https://download.csdn.net/download/u010261063/87615750 1. 在工程下建议FreeRTOS文件夹 在FreeRTOS文件夹下建立 src , port include 文件夹 &#xff08;src用于存放freertos源码&#xf…

2023/06/02 软件PM入门学习(一)

视频参考地址&#xff1a; B站闫波软件项目管理视频学习. 视频资源&#xff1a;video P1-P2 本文重点&#xff1a;&#xff08;软件&#xff09;项目管理定义、PMBOK十大领域及五大标准化过程 简书日更计划同步记录&#x1f3c3;… 项目管理 定义 一系列随着项目的进行而进行…

八大排序算法归纳

1、排序 排序&#xff1a;所谓排序就是使一连串记录&#xff0c;按照其中某个或某个关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序记录序列中存在有多个具有相同关键字的记录&#xff0c;若经过排序这些记录的相对次序保持不变&…