2013-03-02 66 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