0
我有編輯特定項目的視圖。以下是我準備一個視圖模型爲這一觀點做:映射發生時自動調用自定義函數(用於填充屬性)
- 獲取項目信息
- 準備一個新的視圖模型對象ANP我的項目映射到它。
- 通過調用函數來填充TechnologyString來填充它。
顯示視圖。
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的解決方案適用於技術不屬於我的域模型的情況。但在這種情況下,它是。
感謝您的答覆。你的解決方案有效,但同時,我發現了另一種基於映射的解決方案,我編輯了我的問題以顯示它。你可以看一下嗎? – Bronzato 2012-01-15 11:44:46
@Bronzato,啊,所以你已經在你的域模型上有一個'Technologies'屬性?太好了,你應該提到這一點。所以你的項目實際上已經是一個聚合根。在這種情況下你的解決方案很好。我很困惑,因爲你在你的問題中展示了這個「m_ProjectBusiness.ListTechnologies(project);'調用,並且我認爲你的項目模型中沒有這些信息。實際上這個調用並不是必須的,因爲項目包含了它的技術,所以通過從一個slu fet中獲取一個項目,你已經擁有了所需的一切。加入映射是正確的方法。 – 2012-01-15 11:47:21
我的問題並不完全清楚。由於您的解決方案也有效,我將其標記爲已接受。謝謝。 – Bronzato 2012-01-15 11:52:08