2012-01-15 68 views
0

我有編輯特定項目的視圖。以下是我準備一個視圖模型爲這一觀點做:映射發生時自動調用自定義函數(用於填充屬性)

  1. 獲取項目信息
  2. 準備一個新的視圖模型對象ANP我的項目映射到它。
  3. 通過調用函數來填充TechnologyString來填充它。
  4. 顯示視圖。

    public ActionResult Edit(string slug) 
    { 
        // 1 
        Project project = m_ProjectBusiness.GetProject(slug); 
    
        // 2 
        ProjectEditViewModel viewModel = new ProjectEditViewModel 
        { 
         ProjectToEdit = Mapper.Map<Project, ProjectFullViewModel>(project)     
        }; 
    
        // 3 
        viewModel.ProjectToEdit.TechnologyString = m_ProjectBusiness.ListTechnologies(project); 
    
        // 4 
        return View(viewModel); 
    } 
    

正如你可以3點看,我填一個字符串(TechnologyString)位於我的視圖模型,我的對象ProjectToEdit下。我想知道在映射發生時是否可以直接(並自動)執行此操作?

謝謝。


EDIT

我發現基於映射的溶液。這是它:

 Mapper.CreateMap<Project, ProjectFullViewModel>() 
      .ForMember(dest => dest.TechnologyString, 
         opt => opt.MapFrom(src => String.Join(" ", src.Technologies.Select(x => x.Name)))); 

因此,我檢索連接到我的項目的每項技術,並創建一個字符串與所有項目由空格分隔。

讀者:請注意,Darin的解決方案適用於技術不屬於我的域模型的情況。但在這種情況下,它是。

回答

0

這不是應該在您的映射級別處理的東西。您可以使用您將在其中定義了項目的聚合根和技術服務層:

public class ProjectAggregateRoot 
{ 
    public Project Project { get; set; } 
    public string TechnologyString { get; set; } 
} 

,然後在你的服務層的方法,將返回這個聚合根:

public ProjectAggregateRoot GetProjectBySlug(string slug) 
{ 
    var project = _repo.GetProject(slug); 
    var technoString = _repo.ListTechnologies(project); 
    return new ProjectAggregateRoot 
    { 
     Project = project, 
     TechnologyString = technoString 
    } 
} 

,然後你可以直接將你的服務層和視圖模型,像這樣被返回的聚合根之間的映射:

public ActionResult Edit(string slug) 
{ 
    var model = _service.GetProjectBySlug(slug); 

    // now you have everything in the aggregate root to build your view model 
    var viewModel = Mapper.Map<ProjectAggregateRoot, ProjectEditViewModel>(model); 
    return View(viewModel); 
} 
+0

感謝您的答覆。你的解決方案有效,但同時,我發現了另一種基於映射的解決方案,我編輯了我的問題以顯示它。你可以看一下嗎? – Bronzato 2012-01-15 11:44:46

+0

@Bronzato,啊,所以你已經在你的域模型上有一個'Technologies'屬性?太好了,你應該提到這一點。所以你的項目實際上已經是一個聚合根。在這種情況下你的解決方案很好。我很困惑,因爲你在你的問題中展示了這個「m_ProjectBusiness.ListTechnologies(project);'調用,並且我認爲你的項目模型中沒有這些信息。實際上這個調用並不是必須的,因爲項目包含了它的技術,所以通過從一個slu fet中獲取一個項目,你已經擁有了所需的一切。加入映射是正確的方法。 – 2012-01-15 11:47:21

+0

我的問題並不完全清楚。由於您的解決方案也有效,我將其標記爲已接受。謝謝。 – Bronzato 2012-01-15 11:52:08

相關問題