Model层的类:
public class Member { public int MemberId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } public string State { get; set; } }
public class MembersViewModel { public int MemberId { get; set; } public string Name { get; set; } }
public class ProfileViewModel { public string FirstName { get; set; } public string LastName { get; set; } public string ProfilePictureUrl { get; set; } }
public class WelcomeViewModel { public string FirstName { get; set; } public string LastName { get; set; } }
public class MemberRepository { List<Member> _members; public MemberRepository() { _members = new List<Member>(); _members.Add(new Member { MemberId = 1, FirstName = "天风", LastName = "幻灵", Age = 28, State = "死灵国" }); _members.Add(new Member { MemberId = 2, FirstName = "白龙", LastName = "幻灵", Age = 15, State = "龙之国" }); _members.Add(new Member { MemberId = 3, FirstName = "释天", LastName = "幻灵", Age = 29, State = "天国" }); } public Member GetMember(int id) { return _members.FirstOrDefault(m => m.MemberId == id); } public List<Member> GetMembers() { return _members; } }HomeController.cs代码如下:
public class HomeController : Controller { MemberRepository _memberRepository = new MemberRepository(); public ActionResult Index() { return View(); } public ActionResult Welcome() { var member = _memberRepository.GetMember(1); var viewModel = Mapper.Map<Member, WelcomeViewModel>(member); return View(viewModel); } public ActionResult Profile(int id) { var member = _memberRepository.GetMember(id); var viewModel = Mapper.Map<Member, ProfileViewModel>(member); viewModel.ProfilePictureUrl = GetProfileImageUrl(member.MemberId); return View(viewModel); } public ActionResult Members() { var members = _memberRepository.GetMembers(); var viewModel = Mapper.Map<List<Member>, List<MembersViewModel>>(members); return View(viewModel); } private string GetProfileImageUrl(int id) { return string.Format("~/Images/Members/{0}/Profile", id); } }Index.cshtml
@{ ViewBag.Title = "Index"; } <h2> Index</h2> <p>这是一个简单的AutoMapper例子网站,展示了如何在不同的情况下使用。</p> <p>检查映射在Global.asax中是如何创建的,并期待在HomeController中的映射是如何使用的。</p>Members.cshtml
@model List<ViewModels.MembersViewModel> @{ ViewBag.Title = "Members"; } <h2>@ViewBag.Title</h2> <p> 下面是我们的会员的完整列表</p> <ul> @foreach (var member in Model) { <li>@Html.ActionLink(member.Name, "Profile", new { id = member.MemberId })</li> } </ul>Profile.cshtml
@model ViewModels.ProfileViewModel @{ ViewBag.Title = string.Format("{0}的简介", Model.FirstName); } <h2>@ViewBag.Title</h2> <p> 这是<span style="color:red;"> @Model.FirstName @Model.LastName </span>的个人资料页!</p> <p> 他的个人资料图像位于 @Model.ProfilePictureUrl.</p>Welcome.cshtml
@model ViewModels.WelcomeViewModel @{ ViewBag.Title = "Welcome"; } <h2>@ViewBag.Title</h2> <p>欢迎来到示例 @Model.FirstName @Model.LastName!</p>_Layout.cshtml
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>@ViewBag.Title</title> <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> <script src="@Url.Content("~/Scripts/jquery-1.7.2.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/modernizr-2.5.3.js")" type="text/javascript"></script> </head> <body> <header> <h1>AutoMapper 示例</h1> </header> <nav> <ul> <li>@Html.ActionLink("欢迎页面", "Welcome")</li> <li>@Html.ActionLink("简介页面", "Profile", new { id = 2 })</li> <li>@Html.ActionLink("成员列表页面", "Members")</li> </ul> </nav> @RenderBody() <footer> </footer> </body> </html>Global.asax
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; using Bootstrap; using Bootstrap.AutoMapper; using AutoMapper; using AutoMapperExample.Dal; using ViewModels; namespace AutoMapperExample { public class MvcApplication : HttpApplication { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } public static void CreateMaps() { Mapper.CreateMap<Member, WelcomeViewModel>(); Mapper.CreateMap<Member, ProfileViewModel>() .ForMember(dest => dest.ProfilePictureUrl, src => src.Ignore()); //在目标类型我们有个属性ProfilePictureUrl,它有其他的含义(非字面意思或预留字段), 我们不想进行转换 //Name属性在Source中不存在,如果现在创建映射规则,在映射的时候必然会抛出异常。这个时候我们就需要使用自定义解析器来完成映射。 Mapper.CreateMap<Member, MembersViewModel>().ForMember(dest => dest.Name, src => src.ResolveUsing(m => string.Format("{0} {1}", m.FirstName, m.LastName))); //在程序启动时对所有的配置进行严格的验证 Mapper.AssertConfigurationIsValid(); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); CreateMaps(); } } }结果如图: