将视图模型重塑为模型
本文关键字:模型 视图 | 更新日期: 2023-09-27 18:01:46
在客户端,我以一种根据视图需要定制的方式显示数据。
当用户保存并发送数据到服务器时,我不想重塑
上的数据客户端以适应我的域的要求。
重塑我的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; }
}
所有的数据,我需要我的模型周期是在RowViewModel。
我需要重塑我的SavePeriodListViewModel为LessonplannerResponse
当然AutMapper可以处理RowViewModel到Period的映射,但我的问题不在那个领域。
AutoMapper正在映射而不是重塑集合。
我应该把链接重塑代码放在哪里?或者更一般地问我应该把这样的代码在asp.net mvc ?
- 客户端吗?
- 控制器动作?
service不是选项,因为它不应该知道视图模型
看来映射需要在控制器内部进行。我希望控制器动作是这样定义的:
public ActionResult SomeAction(SavePeriodListViewModel model)
{
// transform from model to LessonplannerResponse
// validate model
// do something with the model and return a view
}
从我们对您的流程的观察来看,进行转换似乎不是服务的责任,也不是客户端的责任——特别是因为您已经在您的问题中排除了客户端。
下面是我如何对ViewModel这样做的示例,您也可以在visa verse中实现它。
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());