在客户端,我以为视图需求定制的方式显示数据。
当用户保存并将数据发送到服务器时,我不想重塑
上的数据客户端以满足我的域的要求。
要将我的ViewModel重塑为我的模型,我可以这样做:
var periods = periodListViewModel.CellViewModels
.SelectMany(c => c.Rows)
.Select(
p =>
new Period { LessonNumber = p.LessonNumber });
此代码必须放在有正确责任的地方。
这些是我的课程:
public class SavePeriodListViewModel
{
public int SchoolyearId { get; set; }
public IEnumerable<CellViewModel> CellViewModels { get; set; }
}
public class CellViewModel
{
public CellViewModel()
{
Rows = new List<RowViewModel>();
}
public List<RowViewModel> Rows { get; set; }
}
public class RowViewModel
{
public string DayName { get; set; }
public string SchoolclassCode { get; set; }
public string Content { get; set; }
public int LessonNumber { get; set; }
}
public class LessonplannerResponse
{
public int SchoolyearId { get; set; }
public IEnumerable<Period> Periods { get; set; }
}
我的模型Period所需的所有数据都在RowViewModel中。
我需要将SavePeriodListViewModel重塑为LessonplannerResponse
当然,AutMapper可以处理RowViewModel到Period映射,但我的问题不在那个区域。
AutoMapper正在映射而不是重塑集合。
我应该在哪里放置linq重塑代码?或者更一般的问我应该把这些代码放在asp.net mvc中?
service不是选项,因为它不应该知道viewmodel。
答案 0 :(得分:0)
以下是我如何使用ViewModel进行签名的示例。
Mapper.CreateMap<Faq, FaqViewModel>()
.ForMember(x => x.Answer, opt => opt.MapFrom(src => src.Answer))
.ForMember(x => x.Question, opt => opt.MapFrom(src => src.Question));
var sourceOfModels = _repository.GetFaqListByAppId(id);
var resultOfViewModels = Mapper.Map<List<Faq>, List<FaqViewModel>>(list.ToList());
这对我来说非常适合。
答案 1 :(得分:0)
看起来映射需要在控制器内部进行。我希望Controller Action的定义类似于:
public ActionResult SomeAction(SavePeriodListViewModel model)
{
// transform from model to LessonplannerResponse
// validate model
// do something with the model and return a view
}
从我们对您的流程的看法来看,转换似乎不是服务的责任,也不是客户方的责任 - 特别是因为您已经排除了你问题中的客户方。