如何使用 Automapper 映射导航 属性 视图模型
How to use Automapper to map navigation property viewmodels as well
我正在尝试使用 Automapper return 导航 属性 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
视图映射,显示 table 中的月份列表,我需要将年份名称作为列包含在内
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 的模型映射到它的 ViewModel 并将其作为导航 属性 包含到我的 ViewModel?
主要 class 与其导航 属性 之间存在 1 对 0/1 的关系。
例如我想显示一个月份列表,其中列月份名称和年份名称彼此相邻。 (因为我只想使用 ViewModels 数据注释)
我发现了一个类似的问题 here 但是
我无法让它工作
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);
但我明白了
ArgumentException: Expression 'dest => dest.FinancialYearViewModel.FinancialYearName' must resolve to top-level member and not any child object's properties. Use a custom resolver on the child type or the AfterMap option instead.
Parameter name: lambdaExpression
我尝试时遇到同样的问题
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));
可能这就是你想要的 -
AutoMapper.Mapper.CreateMap<Year, YearViewModel>();
AutoMapper.Mapper.CreateMap<Month, MonthViewModel>()
.ForMember(a => a.Year, b => b.ResolveUsing(c => c.Year));
var o = AutoMapper.Mapper.Map<MonthViewModel>(new Month
{
Id = 1,
MonthName = "January",
YearId = DateTime.Now.Year,
Year = new Year
{
Id = DateTime.Now.Year,
YearName = DateTime.Now.Year.ToString()
}
}); // should map year as well.
我正在尝试使用 Automapper return 导航 属性 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
视图映射,显示 table 中的月份列表,我需要将年份名称作为列包含在内
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 的模型映射到它的 ViewModel 并将其作为导航 属性 包含到我的 ViewModel?
主要 class 与其导航 属性 之间存在 1 对 0/1 的关系。 例如我想显示一个月份列表,其中列月份名称和年份名称彼此相邻。 (因为我只想使用 ViewModels 数据注释)
我发现了一个类似的问题 here 但是 我无法让它工作
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);
但我明白了
ArgumentException: Expression 'dest => dest.FinancialYearViewModel.FinancialYearName' must resolve to top-level member and not any child object's properties. Use a custom resolver on the child type or the AfterMap option instead. Parameter name: lambdaExpression
我尝试时遇到同样的问题
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));
可能这就是你想要的 -
AutoMapper.Mapper.CreateMap<Year, YearViewModel>();
AutoMapper.Mapper.CreateMap<Month, MonthViewModel>()
.ForMember(a => a.Year, b => b.ResolveUsing(c => c.Year));
var o = AutoMapper.Mapper.Map<MonthViewModel>(new Month
{
Id = 1,
MonthName = "January",
YearId = DateTime.Now.Year,
Year = new Year
{
Id = DateTime.Now.Year,
YearName = DateTime.Now.Year.ToString()
}
}); // should map year as well.