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());
}
Ich denke, das könnte Ihnen helfen http://stackoverflow.com/questions/21413273/automapper-convert-from-multiple-sources#answer-21413828 – FabioG
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. –
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