views:

399

answers:

3

let's say we have something like this

public class Person
{
   public string Name {get; set;}
   public Country Country {get; set;}
}

public class PersonViewModel
{
   public Person Person {get; set;}
   public SelectList Countries {get; set;}
}

can automapper be used to perform to parse from Person into PersonViewModel and back ?

+2  A: 

It sounds like you want to send a Person to the view via the PersonViewModel which has all the bonus info you need to generate and return a new (or updated) Person object.

If this is correct, I don't think you need automapper at all. From what I understand of automapper it is for mapping collection of related objects to a more view model type of state, but in this case, you are sending a Person to the client and trying to receive a Person back. In this case, it seems easier to use your view model to populate the page, but have the page return a Person instead (or extract the updated Person from the view model to save a few keystrokes).


EDIT: That being said, yes you should be able to use automapper to move the info around. Its just a unnecessary layer for this easy scenario.

NickLarsen
actually i have done something like this, but ppl said it's bad http://stackoverflow.com/questions/1361092/asp-net-mvc-viewmodel-pattern
Omu
Issue 2 in your accepted answer refers to the fact that you included a SelectListItem enumeration on your view model (which make your controller implement view specific information). The change you need to make to fix it would be to just make it an IEnumerable<String> (or maybe some Country type instead of string) so that your view can decide how to display that information. Passing a select list implies information about how the view should display the data, which is against the idea of MVC.
NickLarsen
+2  A: 

Don't use AutoMapper for this - it's not worth it. For example, in the cases where you have a validation failure and you show the form again - AutoMapper is not executed here (usually). We usually go two routes:

  • If the list is not context-specific, create an HtmlHelper that queries some ISelectListProvider for the select list items: Html.DropDownList(). You'd use your IoC container of choice to locate the personListProvider, query for the list of items, and populate the dropdown list.
  • If the list is context-specific, just construct the list in the controller action
Jimmy Bogard
Could you please tell me your opinion about this ViewModel Pattern http://stackoverflow.com/questions/1361092/asp-net-mvc-viewmodel-pattern
Omu
+2  A: 

if one chose to, you could do this:

public class Person
{
   public string Name {get; set;}
   public Country Country {get; set;}
   public Country[] GetCountries 
   {
    ... add method for countries here
   }
}

Then in your ViewModel you can have your select list pull data from that collection.

public class PersonViewModel
{
   public Person Person {get; set;}
   public Country[] Countries {get; set;}
   public SelectList Countries { get{ .. add new select list code here getting vals from Countries..}}
}

Again, this is for context sensitive lists. You are however muddling concerns a wee bit here (should a person get a list of countries?)

James Fleming