正在浏览有关音乐商店应用程序的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()方法会是什么样子?
答案 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提供其他信息。这里它只用于展示其他类型。它只使用它们的名称,以便用户可以浏览它们。我没有查看教程,但创建,删除或编辑类型需要自己的功能。