2016-11-14 103 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(...