2013-03-02 67 views
1

在客户端,我按照视图需求自定义的方式显示数据。将视图模型重塑为模型

当用户保存,并将数据发送到我不想重塑上

客户端的数据,以适应我的域名要求的服务器。

要重塑我的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以期映射,但我的问题是不是在这方面。

AutoMapper映射不会改变集合的形状。

我应该在哪里放置linq重塑代码?或者更一般的问,我应该在asp.net mvc中把这些代码放在哪里?

  • 客户端?
  • 控制器操作?

服务是没有选择的,因为它不应该知道视图模型。

+0

Elist Automapper很好! – IamStalker 2013-03-02 12:34:46

回答

0

看起来映射需要在控制器内部发生。我希望的是,控制器动作的定义是这样的:从外观

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

    // validate model 

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

,我们已经进入你的过程,它不会出现是一个服务做转型的责任,也不会出现成为客户端的责任 - 尤其是因为您已经在您的问题中排除了客户端。

+0

嗯在你的陈述中有很多“会”字。而你的最后一段让我不确定这是一个陈述还是一个问题。但是我也必须承认,我在某种程度上是盲目的,因为AutoMapper的东西总是在控制器动作中完成。那么为什么重塑不是?!但重塑和制图有一个很大的区别。我可以在客户端进行重塑,并发送重新塑造的视图模型,但是我可以/不应该将客户端映射到域实体。你的回答是正确的,映射/重塑应该发生在行动中,但对我个人而言...... – Elisabeth 2013-03-02 21:52:58

+0

- 现在我再次记得我在客户端有一些特殊的事情 - 我很可能会在客户端进行重塑从我的JS viewmodel到c#viewmodel,从viewmodel直接到模型no DTO,像lessonplannerresponse了。 – Elisabeth 2013-03-02 21:55:38

+0

那么,这对你来说就是英语了......因为我不知道你想要的流程的细节,所以我只是试图根据你的需求提出可能的解决方案。很高兴我能够为你提供一些帮助。 – 2013-03-03 02:33:20

1

这里是我如何做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()); 

这是完美的作品。

+0

从你的样本我假设你还没有理解我的问题,或者你没有正确阅读它。当然你的示例工作。它是一个1:1的映射问题,你用AutoMapper解决了它。但你的回答不是我的问题或我的问题的答案。我不问如何将视图模型映射到模型。 – Elisabeth 2013-03-02 14:23:51

+0

@Elisa,你在哪里看到你的情况有问题? – IamStalker 2013-03-02 14:25:18