2016-11-14 96 views
0

我有一個需要填充數據從實體MVC在哪裏放置配置我的viewmodel的代碼?

我把這個方法我的控制器

public AssessmentResponseVM ConfigureAssessmentViewModel(AssessmentResponseVM model) 
{ 
    if (model.AssessmentID != null) 
    { 
     model.Questions = getQuestionAndAnswerList(model.AssessmentID); 
    }else 
    { 
     model.Questions = getQuestionAndAnswerList(null); 
    } 

    return model; 
} 

它基本上檢索爲提供評估問題和答案的列表,併爲它們分配中的視圖模型到視圖模型的屬性。這個ConfigureAssessmentViewModel方法應該在哪裏生活?目前它坐在我的控制器中,但我不確定我喜歡那裏。它應該坐在viewmodel類還是其他地方?

+0

基於太多的意見以適合SO的合適問題。由於映射可能只適用於控制器,因此控制器中的私有方法將會很好,並將其轉移到單獨的服務。但它不應該在你的視圖模型類中 - 這會讓你的代碼無法進行單元測試,而無需將視圖注入到視圖模型中。您的視圖模型應該不瞭解關聯的數據模型(反之亦然) –

回答

0

在這種情況下,你應該保持在你的控制器這樣的邏輯,並返回一個可枚舉的問題:

var questionsAndAnswersList = getQuestionAndAnswerList(model.AssessmentID); 

另外請注意,你檢查空AssessmentID但隨後傳遞null到getQuestionAndAnswerList反正。

那麼你應該查看使用

@model IEnumerable<Question> 

你也可以在這裏的另一個觀點,即知道如何只顯示問題。請參閱顯示/編輯器模板上的this other question

getQuestionsAndAnswerList很可能屬於服務/業務邏輯類,該類知道如何訪問數據並將其轉換爲控制器知道如何使用的內容。你如何區分你的ViewModel類和Service類真的取決於你的應用程序的大小和偏好。

0

一個很好的答案將是非常詳盡的,但基本上你在這裏是什麼是對象映射圖層的一部分。我見過很多不同的體系結構來處理這個問題。通常最好的事情是保持一致。對我而言,因爲我的業務模型和視圖模型是兩種不同的結構,並且視圖模型對控件的視圖或有時少數幾個視圖進行了高度定製,那麼控制器負責將視圖模型從商業模式。這是因爲我的方法通常涉及數據訪問層,業務層和視圖層(由控制器,視圖模型,視圖組成)。

我的控制器中沒有業務邏輯,所以它們非常薄,它們真正負責的是調用業務層,檢索業務模型,然後用來自業務層的數據填充視圖模型。

控制器是UI和業務層之間的一種粘合劑。

因此,在這種情況下,如果我有這樣一個功能,就像在ViewModel上設置一些數據一樣簡單,並且出於某種原因需要由多個控制器操作重用,那麼我只需做到這一點控制器的私人功能。

如果您正在使用不同的體系結構,那可能不合適。我曾見過業務層返回ViewModels而不是業務模型的情況,以及業務模型中發生的映射。

如果您正在使用現有體系結構,我會將該代碼作爲一個私有函數放在最初創建視圖模型的同一個類中,即該類別包含new AssessmentResponseVM(...