Asp.net mvc 2 MVC2视图模型问题

Asp.net mvc 2 MVC2视图模型问题,asp.net-mvc-2,Asp.net Mvc 2,正在学习音乐商店应用程序的asp.net/mvc教程 参考: 在控制器中,他们正在向视图模型传递一个类型列表,我只是一个初学者,但我觉得视图模型的工作是以视图所需的任何格式显示数据 教程代码可以做到这一点 public ActionResult Index() { // Retrieve list of Genres from database var genres = from genre in storeDB.Genres select genre.Na

正在学习音乐商店应用程序的asp.net/mvc教程

参考:

在控制器中,他们正在向视图模型传递一个类型列表,我只是一个初学者,但我觉得视图模型的工作是以视图所需的任何格式显示数据

教程代码可以做到这一点

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中创建列表,以及设置NumberOfGenes属性。按照这种编码方式,控制器必须比需要更多地了解视图


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

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

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


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

我可能错了,但您似乎对viewModel的构造方式感到困惑。代码正执行您描述的操作

方法返回上面作为列表写入的查询结果。请注意,在调用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表达式,它只会得到流派名称。稍后,这些结果将指定给类的属性


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

我想我很快就可以让它工作了,但是当我构建它的时候,我遇到了类型转换错误。你不是完全错了,我有点困惑,但可能更多的是关于viewModel应该执行的工作。我想做的是让viewModel处理生成列表的问题,而不是在控制器中生成列表并将列表传递给viewModel。ViewModel的主要优点是强类型类,而不是基于字符串的字典。恕我直言,既然模型中已经有了另一个“简单容器”,为什么还需要另一个“简单容器”?可能我不理解viewModel,因为它属于asp.net MVC,但我认为它更像视图的演示者,而不仅仅是视图将访问的数据的容器。实际上,我认为它既是一个简单的容器,也是一个演示者,可以处理诸如格式化日期、创建数据格式(如查询结果列表等)之类的任务。我在其他平台上使用过MVC模式,我可能需要改掉一些旧习惯。好吧,经过一些研究,我明白了。ViewModel的主要优点是强类型类,而不是基于字符串的字典。@JBeckton-但是您可以仅使用模型来强类型视图,您不一定需要ViewModel,所以不确定这是主要优点。@JBeckton,@UpTheCreek——主要的好处是视图模型特定于视图所需的数据,而模型特定于应用程序中的域实体。在一个相当复杂的应用程序中,两者很少是相同的。如果将视图强类型化为域模型,那么您会发现自己在视图数据字典中增加了视图所需的辅助数据。在具有动态ViewModel属性的MVC3中,这可能是可以接受的——我没有使用过它,所以我不能在那里发表评论——但我怀疑仍然会存在阻抗不匹配。