我正在尝试使用Automapper返回导航属性ViewModel
模型:
public class Month
{
public int Id { get; set; }
public string MonthName { get; set; }
public int YearId { get; set; }
public Year Year { get; set; }
}
public class Year
{
public int Id { get; set; }
public string YearName { get; set; }
}
视图模型:
public class MonthViewModel
{
public int Id { get; set; }
public string MonthName { get; set; }
Display(Name = "Financial Year")
public int YearId { get; set; }
public YearViewModel Year { get; set; }
}
public class YearViewModel
{
public int Id { get; set; }
Display(Name = "Financial Year Name")
public string YearName { get; set; }
}
我目前有一个显示月份列表的
ASP.NET MVC
视图映射,我需要将年份作为一列包含进去。public IActionResult Index()
{
var months = _monthRepo.GetAll().Include(m=>m.Year);
IEnumerable<MonthViewModel> monthsVms = MonthViewModel.MapToViewModel(months);
return View(monthsVms);
}
public static IEnumerable<MonthViewModel> MapToViewModel(IEnumerable<Month> dm)
{
Mapper.CreateMap<Month, MonthViewModel>();
Mapper.CreateMap<Year, YearViewModel>();
return Mapper.Map<IEnumerable<Month>, IEnumerable<MonthViewModel>>(dm);
}
//However in my view when I want to refer to the year name like below:
@foreach (var item in Model)
{
@Html.EditorFor(modelItem => item.YearViewModel.YearName)
}
然而item.YearViewModel
是null
。
问题:
- 我如何设置AutoMapper,将相关导航属性ViewModel的Model映射到其ViewModel,并将其包含为我的ViewModel的导航属性?
主类与其导航属性之间存在一对一关系。 例如,我想要显示一个月份列表,每个月份旁边都有“月份名称”和“年份名称”两列。(因为我只想使用ViewModels的数据注释)
我在这里找到了一个类似的问题,但是我无法使其正常工作。
Mapper.CreateMap<Month, MonthViewModel>().ForMember(dest => dest.YearViewModel.YearName, opt => opt.MapFrom(src => src.Year.YearName));
Mapper.CreateMap<Year, YearViewModel>();
return Mapper.Map<IEnumerable<Month>, IEnumerable<MonthViewModel>>(dm);
但是我遇到了同样的问题,当我尝试时。
Mapper.CreateMap<Year, YearViewModel>();
AutoMapper.Mapper.CreateMap<Month, MonthViewModel>()
.ForMember(a => a.YearViewModel.YearName, b => b.ResolveUsing(c => c.Year.YearName));
解决方案是将整个导航属性进行映射。
Mapper.CreateMap<Year, YearViewModel>();
AutoMapper.Mapper.CreateMap<Month, MonthViewModel>()
.ForMember(a => a.YearViewModel, b => b.ResolveUsing(c => c.Year));