MVC在哪里放置配置我的viewmodel的代码?

时间:2016-11-14 23:11:36

标签: asp.net-mvc

我有一个需要使用实体数据填充的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类还是其他地方?

2 个答案:

答案 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(...的类