0

在客户端,我以针对视图需求定制的方式显示数据。

当用户保存数据并将其发送到服务器时,我不想重塑数据

客户端以适应我的域的要求。

要将我的 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 不是选项,因为它不应该知道视图模型。

4

2 回答 2

0

看起来映射需要在控制器内部进行。我希望控制器动作被定义为:

public ActionResult SomeAction(SavePeriodListViewModel model)
{
    // transform from model to LessonplannerResponse

    // validate model

    // do something with the model and return a view
}

从我们对您的流程的了解来看,进行转换似乎不是服务的责任,也不是客户端的责任——尤其是因为您已经排除了客户端在你的问题中。

于 2013-03-02T18:39:45.660 回答
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());

这对我来说很完美。

于 2013-03-02T12:36:52.900 回答