【问题标题】:MVC 2 viewmodels questionMVC 2 视图模型问题
【发布时间】:2010-08-01 06:02:37
【问题描述】:

刚刚完成了有关音乐商店应用程序的 asp.net/mvc 教程。

参考:http://www.asp.net/mvc/tutorials/mvc-music-store-part-3

在控制器中,他们将流派列表传递给视图模型,我只是一个初学者,但我觉得以视图所需的任何格式呈现数据是视图模型的工作。

教程代码是这样做的...

public ActionResult Index() 
{     
    // Retrieve list of Genres from database     
    var genres = from genre in storeDB.Genres select genre.Name;       

    // Set up our ViewModel     
    var viewModel = new StoreIndexViewModel()
    {         
        Genres = genres.ToList(),         
        NumberOfGenres = genres.Count()
    }; 

    // Return the view     
    return View(viewModel);
}

我想要做的是将流派传递给 viewModel,然后在 viewModel 中创建列表并设置 NumberOfGenres 属性。这种编码方式控制器必须比它需要的更多地了解视图。

谁能告诉我我的 viewModel 类会是什么样子,以便在我的 viewModel 中的 Genres 属性上使用 ToList() 和 Count() 方法?

【问题讨论】:

  • 我想我已经快要让它工作了,但是我在构建它时遇到了类型转换错误。

标签: asp.net-mvc-2


【解决方案1】:

我不同意你的观点。控制器对视图一无所知,只知道模型。视图模型 IMO 应该是一个简单的容器,就像它在教程中一样。控制器的工作是用数据填充容器并将其传递给视图。

视图模型是否像它需要的那样简单是一个悬而未决的问题,即您可以轻松地从它们的列表中得出类型的数量,因此实际上没有必要将其作为单独的属性。如果您只想将列表存储在模型中,您所要做的就是在视图中调用 Count() 方法,而不是在控制器中执行它。

不知道教程,但是我不确定他们是否这样做是为了向模型添加分页。如果您确实想在模型中支持分页,那么您会希望将总计数作为一个单独的属性,因为您只会将集合的一部分传递给视图。

【讨论】:

  • 尊敬的,当我在模型中已经有了另一个“简单容器”时,为什么还需要另一个“简单容器”?我可能不理解 viewModel 因为它与 asp.net MVC 有关,但我认为它更像是视图的演示者,而不仅仅是视图将访问的数据的容器。我实际上认为它既是一个简单的容器,也是一个演示者,它处理诸如格式化日期、创建数据格式(例如从查询结果中的列表等)之类的任务。我在其他平台上使用过 MVC 模式,我可能需要改掉一些旧习惯。
  • 好的,经过一番研究,我明白了。 ViewModel 的主要优点是强类型类与基于字符串的字典。
  • @JBeckton - 但是您可以只使用模型来强烈键入视图,您不一定需要 ViewModel,所以不确定这是主要的好处。
  • @JBeckton, @UpTheCreek -- 主要好处是视图模型特定于视图所需的数据,而模型特定于应用程序中的域实体。在一个相当复杂的应用程序中,这两者很少是相同的。如果您使视图强类型化到您的域模型,那么您会发现自己使用视图所需的辅助数据来扩充视图数据字典。在具有动态 ViewModel 属性的 MVC3 中,这可能是可以接受的——没有使用它,所以我不能在那里发表评论——但我怀疑仍然会有阻抗不匹配。
【解决方案2】:

我可能错了,但您似乎对 viewModel 的构造方式感到困惑。该代码完全按照您的描述进行。

ToList() 方法返回上面写为列表的查询结果。请注意,在调用 ToList() 之前它不会执行。

从数据库中获取结果后,将它们分配给 StoreIndexViewModel 类中的属性。

如果我们用另一种方式编写代码可能更容易理解

public ActionResult Index() 
{     
    // Retrieve list of Genres from database     
    var genres = from genre in storeDB.Genres select genre.Name;
    var genresList=genres.ToList();       

    // Set up our ViewModel     
    StoreIndexViewModel viewModel = new StoreIndexViewModel()
    viewModel.Genres=genresList;
    viewModel.NumberOfGenres=genresList.Count;

    // Return the view     
    return View(viewModel);
}

更新:

您不会在 ViewModel 中生成列表。您从数据库中获取它们。如果您查看 LINQ 表达式,它只会获取流派名称。稍后将这些结果分配给类的属性。

ViewModel 用于向视图提供附加信息。在这里它仅用于显示其他类型。它只使用他们的名字,以便用户可以浏览它们。我没有查看教程,但创建、删除或编辑流派需要它们自己的功能。

【讨论】:

  • 你并没有完全错,我有点困惑,但可能更多的是关于 viewModel 应该执行的工作。我想做的是让 viewModel 处理生成一个列表,而不是在控制器中执行它并将列表传递给 viewModel。
  • 好的,经过一番研究,我明白了。 ViewModel 的主要优点是强类型类与基于字符串的字典。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多