2011-03-28 62 views
2

我有一個視圖模型,看起來像這樣:ViewModel與另一個ViewModel的集合 - AutoMapper可以幫我嗎?

public class CreateReviewViewModel 
{ 
    public string Title { get; set; } 
    public decimal Score { get; set; } 
    public ICollection<RecommendationViewModel> Recommendations { get; set; } 
} 

因此,前兩個是基本的本地類型 - 容易。

第三個屬性是另一個視圖模型的集合:

public class RecommendationViewModel 
{ 
    public RecommendationType RecommendationType { get; set; } 
    public bool IsRecommendedFor { get; set; } 
} 

RecommendationType是在我的域模型,其中有代表不同的「推薦」 byte值的enum

在我[HttpGet]動作,我這樣做:

var model = new CreateReviewViewModel 
{ 
    Recommendations = SomeMethodWhichLoopsThroughTheEnumMembersAndCreatesTheModel(); 
} 
return View(model); 

所以我最終的RecommendationViewModel列表,與bool屬性設置爲false

然後在我看來,我使用EditorTemplates:

@Html.EditorFor(model => model.Recommendations)

其中要求呈現爲兩個屬性標籤和複選框的自定義編輯模板。涼。

所以 - 有背景,希望有道理。

如何在[HttpPost]操作中將該ViewModel映射到Review域模型?

Review對象的部分看起來像這樣:

public class Review 
{ 
    public bool IsRecommendedForA { get; set; } 
    public bool IsRecommendedForB { get; set; } 
    // etc 
} 

我目前做的自定義映射關係是這樣的:

var review = new Review(); 
review.IsRecommendedForA = this.Recommendations.SingleOrDefault(x => x.RecommendationType == RecommendationType.A).IsRecommendedFor; 
review.IsRecommendedForB = this.Recommendations.SingleOrDefault(x => x.RecommendationType == RecommendationType.B).IsRecommendedFor; 

這是非常乏味的。

我可以使用AutoMapper完成上述任務嗎?

當然,我可以只需添加各種不同的RecommendationType的作爲視圖模型,而不是一個集合的基本屬性,但後來我查看的變得複雜,我無法使用EditorTemplates通過收集隱式循環 - 我將不得不爲每個屬性寫出Html.EditorFor

任何想法?

回答

0

我有一個可能的解決方案

Mapper.CreateMap<CreateReviewViewModel, Review>() 
    .ForMember(dest => dest.IsRecommendedForA, opt => opt.MapFrom(src => src.IsRecommendedFor(RecommendationType.A))) 
    .ForMember(dest => dest.IsRecommendedForB, opt => opt.MapFrom(src => src.IsRecommendedFor(RecommendationType.B))); 

IsRecommendedFor是鉤屬性,使用之前在我的問題說的LINQ表達摸出如果模型包含屬性,它的檢查。

哪個比手動從左到右好,但仍然不是很好。

我看了一下自定義轉換器/解析器,但沒有采取額外的參數(例如,解析從此到此,也使用這個參數),所以我看不到我如何使用它們。

我現在就去,但希望有人知道如何做得更好。

0

你需要爲每個可能的枚舉值單獨存儲這些布爾值的任何原因?一個標誌,意味着你可以啓用了多種類型的...我喜歡這種感覺會更好:

public class Review { 
    public RecommendationType Types { get; set; } 

    public bool IsReviewFor(RecommendationType types) { 
     // bitwise comparison, check if the flags 
     // given are in the Types property also 
    } 
} 

更容易映射,更少的代碼,添加/刪除新的類型時,更具擴展性。

myReview.IsReviewFor(RecommendationType.X | RecommendationType.Y | RecommendationType.Z) 
+0

「評論」是使用實體框架來堅持我的表名爲「審查」,這是一個平坦的表POCO - 具有單一的扁平級別的所有這些領域是出於性能的考慮。 – RPM1984 2011-03-30 22:57:46

相關問題