代码之家  ›  专栏  ›  技术社区  ›  JBeckton

MVC 2 viewmodels问题

  •  1
  • JBeckton  · 技术社区  · 14 年前

    正在学习有关音乐商店应用程序的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()方法吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   tvanfosson    14 年前

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

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

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

        2
  •  1
  •   Ufuk Hacıoğulları    14 年前

    我可能错了,但您似乎对viewModel是如何构造的感到困惑。代码正按照您描述的那样执行。

    从数据库中获取结果后,这些结果将被分配给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用于向视图提供附加信息。在这里它只用来显示其他流派。它只使用他们的名字,所以用户可以浏览他们。我没有检查教程,但创建,删除或编辑流派需要自己的功能。