【问题标题】:Is Creating an Instance of a ViewModel in a View ok?在视图中创建 ViewModel 的实例可以吗?
【发布时间】:2013-02-11 23:18:20
【问题描述】:

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

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

我有一个Student/Index,它返回一个ActionResult,它采用StudentViewModel 但我也有一个 Course/Index 视图,它返回一个 ActionResult 需要一个 CourseViewModel

这应该为我的问题奠定基础: 如果我遵循这个选项可以吗,我认为它非常简洁: 在Student/Index 视图中创建ViewModel 的实例

 @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

那么哪种方法更好呢?在View 中创建ViewModelModel 的实例肯定不会那么糟糕?

【问题讨论】:

  • FWIW 我通常在中间添加一个层来“组合”更复杂的视图模型,以避免控制器和/或重复逻辑的混乱(请参阅我的答案stackoverflow.com/a/14132184/453277)。
  • @TimMedora 您的回答介绍了很多我需要阅读的术语。作曲家? :P
  • 这感觉像是一个更适合 programmers.stackexchange.com 的问题 - 我认为“可以吗...”没有一个规范的答案

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


【解决方案1】:

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

为了 SOC,我将重构此代码以使用带有子操作方法的 Partials

Html.Action("path/tocourse");

子动作将实例化并传递模型,从而减轻您的视图。

[ChildActionOnly]
public ActionResult tocourse()
{

courseviewModel model = new courseviewModel();

    return PartialView(model);
}

【讨论】:

  • SOC?那是什么?嗯,那我可以单独获取数据。我有点需要它。
  • 关注点分离:意思是在你的观点中尽可能少做。依靠您的控制器来完成繁重的工作。这被认为是最佳实践。但就像所有这些指导方针一样,它们不是宗教,只是考虑。我相信情况会有所不同。
  • 哦,是的,我知道 SoC 是什么。它只是没有点击:S。
  • 仍然不确定这是否能正常工作。如前所述,Student 类被建模为封装 List,如果我要给另一个程序员,他们不会期望立即获得全部数据?
  • 啊,我的实现很草率。你必须通过课程对象来实现我的方式。老实说,你的方式很“整洁”并且会奏效。我偏爱自己的方式,它遵循不在 View 中实例化的“最佳实践”准则。但同样,你的方法没有错。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2014-07-12
    • 1970-01-01
    相关资源
    最近更新 更多