是否在View中创建ViewModel实例?

时间:2013-02-11 23:18:20

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 partial-views

例如我有模特: StudentCourseStudent有一个List<Course> Courses{get;set;}

所有数据都已从网络服务中填充

我有一个Student/Index,它返回一个StudentViewModel的ActionResult 但是我还有一个Course/Index视图,它返回一个ActionResult需要CourseViewModel

这应该为我的问题奠定基础: 如果我遵循这个选项,我觉得它非常简洁: 在ViewModel视图

中创建Student/Index的实例
 @foreach(var course in Model.Courses)
    {
       Html.RenderPartial("path/tocourse", 
        new CourseViewModel{Course = course}) ;
    }

或者我应该让StudentViewModel拥有List<CourseViewModel>,所以我可以:

@foreach(var courseViewModel in Model.CourseViewModels)
{
       Html.RenderPartial("path/tocourse", courseviewModel) ;
}

乍一看,上面的内容可能看起来更好,但在Index动作(或其他)中,它需要我执行以下操作:

 new StudentViewModel{
            CourseViewModels = courses.Select(c=>new CourseViewModel{copy stuff}).ToList()
       } 

我讨厌这一点,而且以后可能会让我感到困惑,或者另一个开发人员看到另一个间接让我可以访问课程,StudentViewModel.StudentModel.Courses

那么哪种方法更好?当然,在ViewModel中创建ModelView的实例是不是

2 个答案:

答案 0 :(得分:4)

这样做完全没问题。它不被视为最佳实践。最佳实践是在视图中尽可能少地处理或实例化。

为了SOC,我会重新考虑此代码以使用Partials with Child Action Methods

Html.Action("path/tocourse");

Child Action将实例化并传递模型,从而减轻你的观点。

[ChildActionOnly]
public ActionResult tocourse()
{

courseviewModel model = new courseviewModel();

    return PartialView(model);
}

答案 1 :(得分:0)

理想情况下,您的视图不应具有任何viewmodel实例逻辑,而控制器应该执行所有这些操作并将该模型提供给视图。视图应该干净。并且viewmodel应该只具有视图所需的那些属性。现在,您可以拥有一个足够复杂的模型,但如果您发现某个特定模型对于您的视图非常复杂,只需创建一个特定于该视图的视图模型,其视图需要的属性有限。