Asp.net mvc 使用ViewModel在MVC中显示所有项目

Asp.net mvc 使用ViewModel在MVC中显示所有项目,asp.net-mvc,model-view-controller,linq-to-sql,Asp.net Mvc,Model View Controller,Linq To Sql,我有一个显示实体列表的视图(L2Sql),我已经有了一个ViewModel,其中包含一些用于编辑/查看的属性。建议将IEnumerable传递到视图中以列出所有实体,还是谨慎地传递ViewModel列表 HTM 更新:根据原因,以下是我的ViewModel: public class CategoryViewModel { #region Properties public IEnumerable<CategoryViewModel> Categori

我有一个显示实体列表的视图(L2Sql),我已经有了一个ViewModel,其中包含一些用于编辑/查看的属性。建议将IEnumerable传递到视图中以列出所有实体,还是谨慎地传递ViewModel列表

HTM

更新:根据原因,以下是我的ViewModel:

public class CategoryViewModel
   {
      #region Properties

      public IEnumerable<CategoryViewModel> Categories { get; set; }
      public int Id { get; set; }
      public string Name { get; set; }
      public int Order { get; set; }
      public int? ParentCategoryId { get; set; }

      #endregion
   }
public类CategoryViewModel
{
#区域属性
公共IEnumerable类别{get;set;}
公共int Id{get;set;}
公共字符串名称{get;set;}
公共整数顺序{get;set;}
public int?ParentCategoryId{get;set;}
#端区
}
视图使用Categories属性作为dropdownlist,这是否可以接受?

IEnumerable
是推荐的方法。我见过许多人这样定义他们的视图模型:

public class MyViewModel
{
    public SomeDomainEntity1 Entity1 { get; set; }
    public SomeDomainEntity2 Entity2 { get; set; }
    public IEnumerable<SomeDomainEntity3> Entities3 { get; set; }
}    
公共类MyViewModel
{
public SomeDomainEntity1 Entity1{get;set;}
public SomeDomainEntity2 Entity2{get;set;}
公共IEnumerable实体3{get;set;}
}    
实际上,这不是视图模型的正确用法。这对我来说根本不是视图模型。视图模型不应引用任何实体域模型。

IEnumerable
是推荐的方法。我见过许多人这样定义他们的视图模型:

public class MyViewModel
{
    public SomeDomainEntity1 Entity1 { get; set; }
    public SomeDomainEntity2 Entity2 { get; set; }
    public IEnumerable<SomeDomainEntity3> Entities3 { get; set; }
}    
公共类MyViewModel
{
public SomeDomainEntity1 Entity1{get;set;}
public SomeDomainEntity2 Entity2{get;set;}
公共IEnumerable实体3{get;set;}
}    

实际上,这不是视图模型的正确用法。这对我来说根本不是视图模型。视图模型不应引用任何实体域模型。

如果您只需要来自可枚举项的信息,将其直接传递给视图没有什么错。如果您需要一些额外的信息(例如:当前用户或任何其他信息),您应该将枚举作为属性放入ViewModel中。

如果您只需要枚举中的信息,直接将其传递给视图没有什么错。如果您需要一些额外的信息(例如:当前用户或任何其他信息),您应该在ViewModel中将您的可枚举性作为属性。

我认为scottGu和同事的nerddinner()教程就是这样做的。在我标记为答案之前,您可以检查我的更新吗?我只是想把这件事搞清楚。@raklos,这就是我最初发表文章的原因,尽管我可以看到故事的两面。如果您开始在视图中向下钻取一个封闭的DataContext,您就有麻烦了,因此需要脱离持久层。@Mantorok,您更新的答案显示了一个完全有效的视图模型。raklos,nerddinner也会做这样的事情,所以虽然这是学习MVC的一个良好开端,但如果你想遵循最佳实践,那就不是我推荐学习的应用程序。@DarinDimitrov,当然-出于兴趣,你能推荐在哪里找到最佳实践.net MVC吗?我认为nerddinner()scottGu和同事的教程就是这样做的。在我标记为答案之前,你能检查一下我的更新吗?我只是想把这件事搞清楚。@raklos,这就是我最初发表文章的原因,尽管我可以看到故事的两面。如果您开始在视图中向下钻取一个封闭的DataContext,您就有麻烦了,因此需要脱离持久层。@Mantorok,您更新的答案显示了一个完全有效的视图模型。raklos,nerddinner也会这样做,所以虽然这是学习MVC的一个良好开端,但如果你想遵循最佳实践,我不推荐你学习它。@DarinDimitrov,当然-出于兴趣,你能推荐在哪里找到最佳实践.net MVC吗?