MVC 2 viewmodels问题

时间:2010-07-31 21:22:58

标签: asp.net-mvc-2

正在浏览有关音乐商店应用程序的asp.net/mvc教程。

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

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

教程代码执行此操作...

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()方法会是什么样子?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

ToList()方法返回上面写为List的查询结果。请注意,在调用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用于向View提供其他信息。这里它只用于展示其他类型。它只使用它们的名称,以便用户可以浏览它们。我没有查看教程,但创建,删除或编辑类型需要自己的功能。