本篇AutoMapper使用场景:

※ 动态实现接口方法或属性

※ 目标中的属性如果比源多,可以忽略多出的属性

※ 目标有virtual属性,可忽略

※ 目标属性值为null的解决办法

※ int转string

※ bool转string

※ DateTime转String

※ 判断条件

动态实现接口方法或属性

public interface ICreateOrderMessage

{

string CustomerName { get; set; }

}

□ 使用

public ActionResult Dynamic()

{

var order = new {CustomerName = "darren"};

var message = Mapper.DynamicMap<ICreateOrderMessage>(order);

//message中会有CustomerName属性和值

return View(message);

}

□ 要点

传入的实现类或匿名类,动态实现接口方法或属性。

目标中的属性如果比源多,可以忽略多出的属性

□ View model

public class Order3Dto

{

public decimal Amount { get; set; }

}

□ Domain model

public class Order3

{

public int Id { get; set; }

public decimal Amount { get; set; }

}

□ 映射配置

Mapper.CreateMap<Order3Dto, Order3>()

.ForMember("Id", opt => opt.Ignore());

□ 使用

public ActionResult To()

{

var orderDto = new Order3Dto() {Amount = 50m};

//源没有的属性,预先赋值

var order = new Order3() {Id = 4};

Mapper.Map(orderDto, order);

return View(order);

}

□ 要点

如果目标的属性多于源中的属性,并且不赋值,会报错。

目标有virtual属性,可忽略

□ View model

public class UserInfoViewModel

{

public int ID { get; set; }

public string LoginName { get; set; }

}

□ Domain model

public class UserInfo

{

public UserInfo()

{

this.R_UserInfoActionInfo = new HashSet<R_UserInfoActionInfo>();

}

public int ID { get; set; }

public string LoginName { get; set; }

public DateTime SubTime { get; set; } //目标中多出的属性

public virtual ICollection<R_UserInfoActionInfo> R_UserInfoActionInfo { get; set; } //目标中多出的属性,且是virtual

}

public class R_UserInfoActionInfo

{

public string Name { get; set; }

}

□ 映射配置

Mapper.CreateMap<UserInfoViewModel, UserInfo>()

.ForMember("SubTime", opt => opt.Ignore())

.ForMember("R_UserInfoActionInfo", opt => opt.Ignore());

□ 使用

public ActionResult Concern()

{

UserInfoViewModel vmodel = new UserInfoViewModel()

{

LoginName = "Darren"

};

UserInfo dmodel = Mapper.Map<UserInfoViewModel, UserInfo>(vmodel);

dmodel.SubTime = DateTime.Now; //多出的属性虽然在映射配置中忽略了,但还是可以赋值

return View(dmodel);

}

目标属性值为null的解决办法

.ForMember(dto => dto.AuthorBio, opt => opt.NullSubstitute("Not set yet."))

int转string

.ForMember(dto => dto.NumberOfPosts, opt => {

opt.AddFormatter<NumberOfPostsFormatter>();

})

public class NumberOfPostsFormatter : IValueFormatter

{

public string FormatValue(ResolutionContext context)

{

int value = (int)context.SourceValue;

if(value = 1)

return "Number of Posts: One post";

return "Number of posts:" + value;

}

}

bool转string

.ForMember(dto => dto.VIP, m => m.ResolveUsing<VIPResolver>().FromMember(x => x.VIP))

public class VIPResolver : ValueResolver<bool, string>

{

protected override string ResolveCore(bool source)

{

return source ? "Y" : "N";

}

}

DateTime转String

.ForMember(dto => dto.DateOfBirth, m => m.AddFormatter<DateFormatter>());

public class DateFormatter : IValueFormatter

{

public string FormatValue(ResolutionContext context)

{

return ((DateTime)context.SourceValue).ToLongDateString();

}

}

判断条件

Mapper.CreateMap<AutoMapperInMvc01.Portal.Models.Foo, AutoMapperInMvc01.Portal.Models.Bar>()

.ForMember("baz", opt => opt.Condition(context => context.SourceValue.ToString() == "0"));

AutoMapper在MVC中的运用05-映射中的忽略、处理null、多种映射转换的更多相关文章

  1. AutoMapper在MVC中的运用01-配置、使用、单元测试、举例

    MVC中,如果想在Domain Model和View Model之间建立映射,用AutoMapper是一个不错的选择.不仅如此,AutoMapper能在不同对象之间建立映射,比如string与int类 ...

  2. AutoMapper在MVC中的运用07-映射在订单场景的例子

    本文参考了Taswar Bhatti的博客,他写了<Instant AutoMapper>这本书.遗憾的是,这本电子版书在国内还买不到,也下载不到.也只能从他的有限几篇博文中来窥探一二了. ...

  3. [asp.net mvc 奇淫巧技] 05 - 扩展ScriptBundle,支持混淆加密javascript

    一.需求: 在web开发中,经常会处理javascript的一些问题,其中就包括js的压缩,合并,发布版本以及混淆加密等等问题.在asp.net 开发中我们使用ScriptBundle已经可以解决ja ...

  4. MVC与MVVM之间在IOS中的区别

    作为一个iOS开发者,我不止一次听到我的一些开发者朋友跟我说我写的iOS代码看起来好舒服,很整洁,为什么咱们iOS开发的相当一大部分应用软件都给人以美的享受,究竟是什么使得iOS上的应用可以如此漂亮? ...

  5. 集合映射中的映射列表(使用xml文件)

    如果持久化类具有List对象,我们可以通过映射文件中的类的<list>元素或注释来映射List. 在这里,我们正在使用论坛的场景,其中一个问题有多个答案. 在这里,我们使用论坛的场景,其中 ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (35) ------ 第六章 继承与建模高级应用之TPH继承映射中使用复合条件

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-11  TPH继承映射中使用复合条件 问题 你想使用TPH为一张表建模,建模中使 ...

  7. ASP.NET MVC搭建项目后台UI框架—8、将View中选择的数据行中的部分数据传入到Controller中

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  8. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. 对于Mybatis在C#.Net中个人使用的总结(一) Mybatis 的结果映射

    (图片中的文字上传之后就都看不清,我再图片的下边会用斜体字标清) 首先我在项目中使用Mybatis 是用XML完成映射的.至于XML这门语言,其实很简单的(对于入门来说,因为我是刚入门哈~),如果你还 ...

  10. MVC中处理Json和JS中处理Json对象

    MVC中处理Json和JS中处理Json对象 ASP.NET MVC 很好的封装了Json,本文介绍MVC中处理Json和JS中处理Json对象,并提供详细的示例代码供参考. MVC中已经很好的封装了 ...

随机推荐

  1. Gitlab的安装汉化及问题解决

    Gitlab的安装汉化及问题解决(2017/12/14目前版本为10.2.4) 一.前言 Gitlab需要安装的包太TM多了,源码安装能愁死个人,一直出错,后来发现几行命令就装的真是遇到的新大陆一样. ...

  2. MySQL用户密码过期登陆报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

    今天接到主从复制失败告警,查看MySQL,发现MySQL能够登陆但是执行命令报错, ERROR 1820 (HY000): You must reset your password using ALT ...

  3. tar压缩文件排除文件夹【原创】

    例如压缩redis-3.2.0目录,但是不想压缩redis-3.2.0下面的src目录 -. --exclude=redis-/src 注意--exclude=redis-3.2.0/src后面一定不 ...

  4. VS 2013 中如何自定义快捷键(图解)

    随着软件的升级其功能也越来越多,所以相应的快捷键也多了起来.VS2013中的快捷方式已经发展为了两个快捷键的组合.例如VS2013中默认的多行注释的快捷功能键为(ctrl+k,ctrl+u).像这样类 ...

  5. oracle数据库查询重复记录

    1.row_number()方法 1 2 3 4 5 6 7 8 9 10 11 SELECT     row_number () over (         PARTITION BY v.acti ...

  6. MongoDB:数据导入CSV文件之错误记录

    测试主机1:Windows 10,MongoDB 3.6.3,WPS 10.1,Notepad++ 7.5.3, 测试主机2:Ubuntu 16.04,MongoDB 4, 今天测试了将数据从文件—— ...

  7. Tomcat不同版本所对应的Servlet/JSP规范

    上午在别人机器上做演示,写好 Servlet居然访问不了.后来回想叻下,觉得应该是Tomcat版本不一致的问题,我用的是Tomcat 7.0建的Project,他们大多数都是用的6.0的版本.回来又仔 ...

  8. java 内部类和向上转型

    当将内部类向上转型为其基类时,尤其是转型为一个接口的时候,内部类就有了用武之地,(从实现某个接口的对象,得到对接口的引用,与向上转型为这个对象的基类,实际上是一样的效果,),这是因为此内部类---某个 ...

  9. js字符串驼峰和下划线互相转换

    // 下划线转换驼峰 function toHump(name) { return name.replace(/\_(\w)/g, function(all, letter){ return lett ...

  10. 【LOJ】#2531. 「CQOI2018」破解 D-H 协议

    题解 BSGS直接解出a和b来即可 代码 #include <bits/stdc++.h> #define fi first #define se second #define pii p ...