--- title: "ASP.NET MVC ViewModel Value Formatting using AutoMapper" date: 2010-01-04T19:49:33.31-06:00 slug: aspnet-mvc-viewmodel-value-formatting-using-automapper published: true --- From [ASP.NET MVC in Action](http://www.manning.com/palermo/) section 4.4.1: > *Views are difficult to unit test, so we want to keep them as thin as possible. … Notice in [the View Model] that all of the properties are strings. We’ll have the [properties] properly formatted before this view model object is placed in view data. This way, the view need not consider the object, and it can format the information properly.* To facilitate the formatting between the Domain Model and the View Model, a few of [AutoMapper](http://www.codeplex.com/AutoMapper)’s features may be utilized. Here’s a DomainModel containing a CurrencyProperty which will needed to formatted for human consumption:public class DomainModel { public decimal CurrencyProperty { get; set; } } Now, here is a ViewModel which will be used to transport the formatted value to the View:public class ViewModel { ///Currency Property - formatted as $#,###.## public string CurrencyProperty { get; set; } } #### #### Mapping from Domain Model to View Model [AutoMapper](http://www.codeplex.com/AutoMapper) provides an easy way to create a mapping between two object types.  For particular tweaks for individual property mappings, the ForMember method can be used like:///Setup mapping between domain and view model static ViewModel() { // map dm to vm Mapper.CreateMap() .ForMember(vm => vm.CurrencyProperty, mc => mc.AddFormatter()); } This sets up a mapping between the DomainModel and ViewModel and additionally applies a custom formatter for CurrencyProperty.  The formatter must implement the IValueFormatter interface like so:public class CurrencyFormatter : IValueFormatter { ///Formats source value as currency public string FormatValue(ResolutionContext context) { return string.Format(CultureInfo.CurrentCulture, "{0:c}", context.SourceValue); } } …and a simple conversion constructor on the ViewModel:/// Creates the view model from the domain model. public ViewModel(DomainModel domainModel) { Mapper.Map(domainModel, this); } Now, neither the Controller or View need concern about any formatting and can stay focused on orchestrating and layout:public ViewResult Index() { var model = new DomainModel{CurrencyProperty = 19.95m}; var viewModel = new ViewModel(model); return View(viewModel); }<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> <% using(Html.BeginForm()) {%> <%= Html.TextBoxFor(m=>m.CurrencyProperty)%> <%} %> *Aside: TextBoxFor is an upcoming ASP.NET MVC 2 feature that’s available today in MVC Futures or the RC.  Check out *[*Matt’s post*](http://www.trycatchfail.com/blog/post/2009/12/11/My-best-%28or-worst%29-MVC-hack-to-datehellip3b.aspx)* for some neat stuff.* #### Mapping from View Model back to Domain Model So now the formatted value is being rendered – but how do we go about the reverse trip back to the server?  First, to define an action:[AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(ViewModel viewModel) { var model = new DomainModel(); viewModel.MapTo(model); // ... return a view or action result } *Aside: for validating that what the user enters is in the correct format, see *[*another post about jQuery Validate here*](/2010/01/01/jQueryValidateAndJeditablePart1.aspx)*.* … and a Map method on the ViewModel:public void MapTo(DomainModel domainModel) { Mapper.Map(this, domainModel); } But this mapping will fail without first creating a definition back from the ViewModel to the Model.  In the ViewModel’s static constructor: // from vm to dm Mapper.CreateMap() .ForMember(dm => dm.CurrencyProperty, mc => mc .ResolveUsing() .FromMember(vm => vm.CurrencyProperty)); This utilizes another [AutoMapper](http://www.codeplex.com/AutoMapper) method - ResolveUsing - which can be used to get the string property back to a decimal.  The ValueResolver is defined like so:public class CurrencyResolver : ValueResolver { ///Parses source value as currency protected override decimal ResolveCore(string source) { return decimal.Parse(source, NumberStyles.Currency, CultureInfo.CurrentCulture); } } #### Conclusions There may be more elegant ways to accomplish formatting for MVC Views, but this method is quite workable.  In particular, I can imagine utilizing [DataAnnotations’s DisplayFormatAttribute](http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayformatattribute.aspx) to decorate the Model or ViewModel and the framework automagically applying the formatting while rendering the View.