2016-05-11 5 views
0

Ich bekomme den Hintergrund Automapper in einer ASP.NET MVC 5-Anwendung für die Zuordnung eines Domänenmodells zu einem ViewModel. Es gibt einen Fall, den ich immer noch nicht lösen kann: wenn das ViewModel (Ziel) eine Eigenschaft hat, die nicht im Domänenmodell (Quelle) ist.Wie kann ich mit Automapper den Feldern im Zielmodell Werte zuweisen, aber nicht im Quellmodell?

Die zwei zusätzlichen Eigenschaften im ViewModel sind IEnumerables, die ich im Controller auffüllen muss.

Wie ich in den Kommentaren im Controller-Block (siehe unten) erkläre, ist das Domänenmodell die Quelle und wird in die View-Tabelle eingegeben. Die zusätzlichen zwei IEnumerables im ViewModel füllen die DropDownLists im HTML.BeginForm() Block.

Die Beispiele, die ich gesehen habe mit .CreateMap<>().ForMember() beschäftigen sich mit Berechnungen oder Transformationen von Eigenschaften im Quellmodell, und nicht in diesem Fall, wo ich etwas in der Steuerung auf der Grundlage der Aktionsparameter definieren.

Meine Frage ist, wie die restlichen IEnumerables, wie in der Steuerung definiert?

Mapping Config in App_Start

public static class MappingConfig 
{ 
    public static void RegisterMaps() 
    { 
     AutoMapper.Mapper.Initialize(config => 
      { 
       config.CreateMap<StudentRoster, StudentRosterViewModel>(); 
      }); 
    } 
} 

Modell und Ansichtsmodell:

[Table("StudentRoster")] 
public partial class StudentRoster 
{ 
    public int ID { get; set; } 

    [Required] 
    [StringLength(3)] 
    public string Campus { get; set; } 

    [Required] 
    [StringLength(4)] 
    public string FiscalYear { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string StudentName { get; set; } 

    public int StudentID { get; set; }    

} 

// ViewModel 

public partial class StudentRosterViewModel 
{ 
    // Automapper successfully mappped the first five fields 
    // to the parent class 
    public int ID { get; set; } 

    public string Campus { get; set; } 

    public string FiscalYear { get; set; } 

    public string StudentName { get; set; } 

    public int StudentID { get; set; }  


    // These two fields are not in the parent class 
    public IEnumerable<SelectListItem> CampusListSelect { get; set; } 
    public IEnumerable<SelectListItem> FiscalYearSelect { get; set; } 
} 

Index Aktion Controller:

// GET: StudentRosterViewModels 
public ActionResult Index(string campus = "MRA", string fy="FY16") 
{ 
    IEnumerable<StudentRoster> query = db.StudentRosters.Where(m=>m.Campus==campus).ToList(); 

    // This successfully maps the domain model to the viewmodel 
    // This IEnumerable will display in the "Table" 
    IEnumerable<StudentRosterViewModel> mappedQuery = 
     AutoMapper.Mapper.Map<IEnumerable<StudentRoster>, IEnumerable<StudentRosterViewModel>>(query); 

    // The two remaining IEnumerables need to be mapped to 'mappedQuery' 
    // CampusListSelect and FiscalYearSelect 
    // These two IEnumerables will populate the dropdownlists in Html.BeginForm() 
    IEnumerable<SelectListItem> CampusList = new SelectList(new List<string> { "CRA", "DRA", "MRA", "PRA" }, campus); 
    IEnumerable<SelectListItem> FiscalYearList = new SelectList(new List<string> { "FY12", "FY13", "FY14", "FY15", "FY16" }, fy);     

    return View(mappedQuery.ToList()); 
} 
+0

Ich denke, das könnte Ihnen helfen http://stackoverflow.com/questions/21413273/automapper-convert-from-multiple-sources#answer-21413828 – FabioG

+0

Vielleicht bekomme ich nicht den Punkt, aber es sieht so aus SO Post beschäftigt sich mit dem Mapping von mehr als einem Quellmodell. Ich habe es mit einem Zielmodell mit zwei Eigenschaften zu tun, die im Quellmodell _nicht_ sind. –

+0

Also, korrigieren Sie mich, wenn ich falsch liege, aber Sie möchten jedes Element in "mappedQuery" von "CampusList" und "FiscalYearList" (alle Elemente durch die gleichen Listen) zu füllen? – MaKCbIMKo

Antwort

1

Sie können versuchen, DynamicMap zu verwenden, um Ihre Elemente aufzufüllen, ohne zusätzliche Klassen für das Mapping zu erstellen.

Im Fall, wenn Sie die alte Version von AutoMapper (4.1 oder unten) verwenden die Sie können etwas folgendes versuchen:

// GET: StudentRosterViewModels 
public ActionResult Index(string campus = "MRA", string fy="FY16") 
{ 
    IEnumerable<StudentRoster> query = db.StudentRosters.Where(m=>m.Campus==campus).ToList(); 

    // This successfully maps the domain model to the viewmodel 
    // This IEnumerable will display in the "Table" 
    IEnumerable<StudentRosterViewModel> mappedQuery = 
     AutoMapper.Mapper.Map<IEnumerable<StudentRoster>, IEnumerable<StudentRosterViewModel>>(query); 

    // The two remaining IEnumerables need to be mapped to 'mappedQuery' 
    // CampusListSelect and FiscalYearSelect 
    // These two IEnumerables will populate the dropdownlists in Html.BeginForm() 
    IEnumerable<SelectListItem> CampusList = new SelectList(new List<string> { "CRA", "DRA", "MRA", "PRA" }, campus); 
    IEnumerable<SelectListItem> FiscalYearList = new SelectList(new List<string> { "FY12", "FY13", "FY14", "FY15", "FY16" }, fy);     

    var objForDynamicMapping = new 
    { 
     CampusListSelect = CampusList, 
     FiscalYearListSelect = FiscalYearList 
    }; 

    foreach(var mappedItem in mappedQuery) 
    { 
     // will create the mapping configuration dynamically 
     AutoMapper.Mapper.DynamicMap(objForDynamicMapping, mappedItem); 
    } 

    return View(mappedQuery.ToList()); 
} 

Im Fall, wenn Sie die AutoMapper 4.2 oder Hoch verwenden.

Dann brauchen Sie nur diese Zeile zu setzen:

var config = new MapperConfiguration(cfg => cfg.CreateMissingTypeMaps = true); 

in Ort, an dem Sie die Mapper-Konfiguration erstellen und verwenden Sie dann nur Methode Map wie:

mapper.Map(objForDynamicMapping, mappedItem); 

statt DynamicMap.

Ich hoffe, es wird helfen.

+0

Ich rollte zu AutoMapper 4.1 herunter.1, aber die zwei Ienumerables sind null. –

Verwandte Themen