C# 自动映射在映射中引用映射
我真的很难做到这一点,我基本上是在尝试为我的C# 自动映射在映射中引用映射,c#,automapper,C#,Automapper,我真的很难做到这一点,我基本上是在尝试为我的索引查看ClubViewModel列表,但要做到这一点,我需要匹配我的俱乐部列表。我使用的是AutoMapper,除了CalendarEntry这是我的数据库模型中的一个列表和视图模型中的一个扁平类之外,一切都很正常 我真的不想改变我的视图模型,因为我以我想要的方式创建视图(每天的bools和相关的开始/完成时间) 首先是控制器,它成功地映射了大部分类: public ActionResult Index() {
索引
查看ClubViewModel
列表,但要做到这一点,我需要匹配我的俱乐部
列表。我使用的是AutoMapper
,除了CalendarEntry
这是我的数据库模型中的一个列表和视图模型中的一个扁平类之外,一切都很正常
我真的不想改变我的视图模型,因为我以我想要的方式创建视图(每天的bools和相关的开始/完成时间)
首先是控制器,它成功地映射了大部分类:
public ActionResult Index()
{
var clubsList = _service.GetAllClubs();
IList<ClubViewModel> clubsViewModelList = new List<ClubViewModel>();
foreach (var item in clubsList)
{
clubsViewModelList.Add(AutoMapper.Mapper.Map<ClubViewModel>(item));
}
return View(clubsViewModelList);
}
public ActionResult Index()
{
var clubsList=_service.GetAllClubs();
IList clubsViewModelList=新列表();
foreach(clubsList中的变量项)
{
添加(AutoMapper.Mapper.Map(项));
}
返回视图(clubsViewModelList);
}
以下是我的存储库模型和枚举以及我的Web视图模型
public class Club
{
public int ClubId { get; set; }
public string Organisation { get; set; }
public List<CalendarEntry> MeetingDays { get; set; }
}
public class CalendarEntry
{
public int CalendarEntryId { get; set; }
public int ClubId { get; set; }
public Days Day { get; set; }
public DateTime From { get; set; }
public DateTime To { get; set; }
}
public enum Days
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
public class ClubViewModel
{
public int ClubId { get; set; }
public string Organisation { get; set; }
public CalendarEntryViewModel CalendarEntryViewModel { get; set; }
}
public class CalendarEntryViewModel
{
public bool IsMonday { get; set; }
public bool IsTuesday { get; set; }
public bool IsWednesday { get; set; }
public bool IsThursday { get; set; }
public bool IsFriday { get; set; }
public DateTime? MondayFrom { get; set; }
public DateTime? MondayTo { get; set; }
public DateTime? TuesdayFrom { get; set; }
public DateTime? TuesdayTo { get; set; }
public DateTime? WednesdayFrom { get; set; }
public DateTime? WednesdayTo { get; set; }
public DateTime? ThursdayFrom { get; set; }
public DateTime? ThursdayTo { get; set; }
public DateTime? FridayFrom { get; set; }
public DateTime? FridayTo { get; set; }
}
公共班级俱乐部
{
public int ClubId{get;set;}
公共字符串组织{get;set;}
公共列表会议日期{get;set;}
}
公共类日历条目
{
public int CalendarEntryId{get;set;}
public int ClubId{get;set;}
公众日{get;set;}
来自{get;set;}的公共日期时间
公共日期时间{get;set;}
}
公众普查日
{
星期一,
星期二,
星期三,
星期四,
星期五,
星期六,
星期日
}
公共类ClubViewModel
{
public int ClubId{get;set;}
公共字符串组织{get;set;}
公共CalendarEntryViewModel CalendarEntryViewModel{get;set;}
}
公共类CalendarEntryViewModel
{
公共bool IsMonday{get;set;}
公共bool IsTuesday{get;set;}
公共bool是星期三{get;set;}
公共bool IsThursday{get;set;}
公共布尔值为星期五{get;set;}
公共日期时间?星期一从{get;set;}
公共日期时间?星期一到{get;set;}
公共日期时间?星期二从{get;set;}
公共日期时间?星期二到{get;set;}
公共日期时间?星期三从{get;set;}
公共日期时间?星期三到{get;set;}
公共日期时间?星期四从{get;set;}
公共日期时间?星期四{get;set;}
公共日期时间?FridayFrom{get;set;}
公共日期时间?星期五到{get;set;}
}
最后,这里是我的自动映射配置方法:
public static void RegisterMappings()
{
Mapper.CreateMap<Club, ClubViewModel>()
.ForMember(dest => dest.CalendarEntryViewModel,
opts => opts.Ignore());
Mapper.CreateMap<CalendarEntry, CalendarEntryViewModel>()
.ForMember(dest => dest.IsMonday, opts => opts.Equals(true))
.ForMember(dest => dest.IsTuesday, opts => opts.Equals(true))
.ForMember(dest => dest.IsWednesday, opts => opts.Equals(true))
.ForMember(dest => dest.IsThursday, opts => opts.Equals(true))
.ForMember(dest => dest.IsFriday, opts => opts.Equals(true))
.ForMember(dest => dest.MondayFrom, opts => opts.Equals(DateTime.Now))
.ForMember(dest => dest.MondayTo, opts => opts.Equals(DateTime.Now))
.ForMember(dest => dest.TuesdayFrom, opts => opts.Equals(DateTime.Now))
.ForMember(dest => dest.TuesdayTo, opts => opts.Equals(DateTime.Now))
.ForMember(dest => dest.WednesdayFrom, opts => opts.Equals(DateTime.Now))
.ForMember(dest => dest.WednesdayTo, opts => opts.Equals(DateTime.Now))
.ForMember(dest => dest.ThursdayFrom, opts => opts.Equals(DateTime.Now))
.ForMember(dest => dest.ThursdayTo, opts => opts.Equals(DateTime.Now))
.ForMember(dest => dest.FridayFrom, opts => opts.Equals(DateTime.Now))
.ForMember(dest => dest.FridayTo, opts => opts.Equals(DateTime.Now));
Mapper.AssertConfigurationIsValid();
}
公共静态无效注册表映射()
{
Mapper.CreateMap()
.FormMember(dest=>dest.CalendarEntryViewModel,
opts=>opts.Ignore());
Mapper.CreateMap()
.ForMember(dest=>dest.IsMonday,opts=>opts.Equals(true))
.ForMember(dest=>dest.IsTuesday,opts=>opts.Equals(true))
.ForMember(dest=>dest.is周三,opts=>opts.Equals(true))
.FormMember(dest=>dest.IsThursday,opts=>opts.Equals(true))
.FormMember(dest=>dest.IsFriday,opts=>opts.Equals(true))
.ForMember(dest=>dest.MondayFrom,opts=>opts.Equals(DateTime.Now))
.ForMember(dest=>dest.MondayTo,opts=>opts.Equals(DateTime.Now))
.ForMember(dest=>dest.TuesdayFrom,opts=>opts.Equals(DateTime.Now))
.ForMember(dest=>dest.TuesdayTo,opts=>opts.Equals(DateTime.Now))
.FormMember(dest=>dest.WednesdayFrom,opts=>opts.Equals(DateTime.Now))
.ForMember(dest=>dest.WednesdayTo,opts=>opts.Equals(DateTime.Now))
.ForMember(dest=>dest.ThursdayFrom,opts=>opts.Equals(DateTime.Now))
.ForMember(dest=>dest.ThursdayTo,opts=>opts.Equals(DateTime.Now))
.ForMember(dest=>dest.FridayFrom,opts=>opts.Equals(DateTime.Now))
.ForMember(dest=>dest.FridayTo,opts=>opts.Equals(DateTime.Now));
assertConfigurationsValid();
}
目前,我只是硬编码布尔值/日期,而我试图让事情正常进行
我是否可以将第二个
CalendarEntry
添加到CalendarEntryViewModel
映射到Club
映射作为附加成员添加到ClubViewModel
映射,或者我这样做是完全错误的?您应该解压缩CalendarEntryViewModel
,以便它更接近地表示日历进入您的域。您当前正试图将列表推入展开的对象中。。这会让你以后更加痛苦
在此之前,我必须提到:
foreach (var item in clubsList)
{
clubsViewModelList.Add(AutoMapper.Mapper.Map<ClubViewModel>(item));
}
然后,删除所有可为空的日期,并仅用两个字段表示此条目:
public DateTime? From { get; set; }
public DateTime? To { get; set; }
然后,您可以按天订购:
foreach (var club in clubsViewModelList) {
club.CalendarEntries = club.CalendarEntries.OrderBy(x => x.Day).ToList();
}
那么在你看来。。按顺序渲染即可:
@foreach (var calendarEntry in club.CalendarEntries) {
Day: @calendarEntry.Day.ToString()
From: @calendarEntry.From.ToString("D")
}
……等等
到了创造的时候。。您只需根据需要呈现条目:
public class ClubCalendarEntryCreateViewModel {
/* other properties here */
public IList<CalendarEntryViewModel> Days { get; set; }
}
公共类ClubCalendarEntryCreateViewModel{
/*这里还有其他物业吗*/
公共IList天数{get;set;}
}
然后在控制器中:
viewModel.CalendarEntries = new ClubCalendarEntryCreateViewModel {
Days = new List<CalendarEntryViewModel>() {
new CalendarEntryViewModel {
IsMonday = true
},
new CalendarEntryViewModel {
IsTuesday = true
},
/* etc... */
}
};
viewModel.CalendarEntries=新建ClubCalendarEntryCreateViewModel{
天数=新列表(){
新的CalendarEntryViewModel{
IsMonday=true
},
新的CalendarEntryViewModel{
IsTuesday=true
},
/*等等*/
}
};
Th
@foreach (var calendarEntry in club.CalendarEntries) {
Day: @calendarEntry.Day.ToString()
From: @calendarEntry.From.ToString("D")
}
public class ClubCalendarEntryCreateViewModel {
/* other properties here */
public IList<CalendarEntryViewModel> Days { get; set; }
}
viewModel.CalendarEntries = new ClubCalendarEntryCreateViewModel {
Days = new List<CalendarEntryViewModel>() {
new CalendarEntryViewModel {
IsMonday = true
},
new CalendarEntryViewModel {
IsTuesday = true
},
/* etc... */
}
};
club.CalendarEntries = Mapper.Map<IList<CalendarEntryViewModel>, IList<CalendarEntry>>(viewModel.CalendarEntries.Days);