我有一个需要使用实体数据填充的viewmodel
我在我的控制器中调用此方法
public AssessmentResponseVM ConfigureAssessmentViewModel(AssessmentResponseVM model)
{
if (model.AssessmentID != null)
{
model.Questions = getQuestionAndAnswerList(model.AssessmentID);
}else
{
model.Questions = getQuestionAndAnswerList(null);
}
return model;
}
它基本上检索所提供评估的问题和答案列表,并将它们分配给viewmodel的属性。这个ConfigureAssessmentViewModel
方法应该在哪里生活?目前它坐在我的控制器中,但我不确定我喜欢那里。它应该位于viewmodel类还是其他地方?
答案 0 :(得分:0)
在这种情况下,您应该将此逻辑保留在控制器中并返回一系列问题:
var questionsAndAnswersList = getQuestionAndAnswerList(model.AssessmentID);
另请注意,您正在检查null AssessmentID,但无论如何都要将null传递给getQuestionAndAnswerList
。
然后你的视图应该使用
@model IEnumerable<Question>
您可能还需要另一个知道如何仅显示问题的视图。请参阅显示/编辑器模板上的this other question。
getQuestionsAndAnswerList
很可能属于服务/业务逻辑类,它知道如何访问数据并将其转换为控制器知道如何使用的内容。如何分离ViewModel类和Service类实际上取决于应用程序和首选项的大小。
答案 1 :(得分:0)
一个好的答案是非常详尽的,但基本上你所拥有的是对象映射层的一部分。我已经看到许多不同的架构以不同的方式处理这个问题。通常最好的事情是保持一致。
对我来说,因为我的商业模式和视图模型是两种不同的结构,并且视图模型是高度定制的视图,或者有时是控制器中的少数视图,然后控制器负责从视图模型中填充视图模型。商业模式。这是因为我的方法通常涉及数据访问层,业务层和视图层(由控制器,视图模型,视图组成)。
我的控制器中没有业务逻辑,因此它们非常薄,而且它们真正负责的是调用业务层,检索业务模型,然后使用业务层中的数据填充视图模型。 / p>
控制器是UI和业务层之间的粘合剂。
因此,在这种情况下,如果我有一个像这样的函数做了一些简单的事情,比如在ViewModel上设置一些数据,并且由于某些原因需要多个控制器动作重用它,那么我只是把它做成一个控制器的私人功能。
如果您使用的是其他架构,则可能不合适。我见过业务层返回ViewModels而不是业务模型的情况,因此映射发生在业务模型中。
如果您正在使用现有架构,我会将该代码作为私有函数放在最初创建视图模型的同一个类中,即包含new AssessmentResponseVM(...
的类