【问题标题】:ASP.NET MVC3 ViewModel - ConfusedASP.NET MVC3 ViewModel - 困惑
【发布时间】:2012-07-20 15:50:11
【问题描述】:

我正在学习 C# ASP.NET MVC 3 中的 ViewModel,但我一直无法在我的视图中显示来自 ViewModel 的数据。

模型

public class Author
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Book> Books { get; set; }
}

public class Book
{
    public int Id { get; set; }
    public int AuthorId { get; set; }
    public string Title { get; set; }
    public decimal Price { get; set; }
}

在我的索引视图中,我想显示作者和书籍的一般列表。我为此制作了一个 ViewModel

public class BookIndexViewModel
{
    public List<Book> Books { get; set; }
    public List<Author> Authors { get; set; }
}

这是来自控制器的 Index() 操作方法

public ViewResult Index()
    {
        BookIndexViewModel viewModel = new BookIndexViewModel();
        viewModel.Authors = db.Authors.ToList();

        // leaving Books empty for now

        return View(viewModel);        
    }

我有一个强类型索引视图,我想在其中显示作者列表:

@model IEnumerable<NewBookStore.ViewModels.BookIndexViewModel>

@foreach (var author in Model.Authors) {
<tr>
    <td>
        @author.Name
    </td>
</tr> 
}

Model.Authors 部分不起作用。当我键入模型时。并等待 IntelliSense 显示作者,它未列出。错误描述为:

“System.Collections.Generic.IEnumerable”不包含“Authors”的定义,并且找不到接受“System.Collections.Generic.IEnumerable”类型的第一个参数的扩展方法“Authors”(您是否缺少using 指令还是程序集引用?)

【问题讨论】:

  • 视图中的模型不应该是 IEnumerable。您正在发送一个模型,其中包含 2 个列表。您没有发送视图模型列表。

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-viewmodel


【解决方案1】:

视图中的模型不应该是 IEnumerable。您正在发送一个模型,其中包含 2 个列表。您没有发送视图模型列表。

【讨论】:

  • 谢谢,我不敢相信解决方案如此简单。总是发生! :)
  • 没问题 :) 这些小事总是你花费最多的时间
【解决方案2】:

@model IEnumerable&lt;NewBookStore.ViewModels.BookIndexViewModel&gt; 应该是 @model BookIndexViewModel 代替!

您不想要 BookIndexViewModel 中的 IEnumerable - Authors 属性直接来自您的 BookIndexViewModel

干杯, 院长

【讨论】:

    【解决方案3】:

    因为您没有传递collection 您的视图,所以您只从您的操作方法中传递了BookIndexViewModel 类的一个对象。

    要解决此问题,请将您的视图更新为仅将其绑定到一个实例而不是 collection

    @model NewBookStore.ViewModels.BookIndexViewModel
    
    @foreach (var author in Model.Authors)
    {
    <tr>
        <td>
            @author.Name
        </td>
    </tr> 
    }
    

    【讨论】:

      【解决方案4】:

      芬奈拉,

      您的错误是您没有正确定义模型。您的模型已经包含 IEnumerable 集合,因此也无需将其设为 Enumerable。试试:

      @model NewBookStore.ViewModels.BookIndexViewModel
      

      【讨论】:

        【解决方案5】:

        改用这个

        @model NewBookStore.ViewModels.BookIndexViewModel
        

        【讨论】:

          【解决方案6】:

          [注意 - 我没有足够的经验来将此作为评论而不是答案!]

          我正在阅读另一篇关于 ViewModels 的文章,根据 @Darin Dimitrov 所说,您应该避免将域对象放入您的 ViewModel,

          “视图模型不应引用任何服务。视图模型不应引用任何域模型。”

          见-> ASP.NET MVC 3 Viewmodel Pattern

          我知道模式更像是不适合所有场景的指南,但与 OP 一样,我需要显示域对象列表(我们只会说书籍和作者),所以在 OP 的示例中,ViewModel 应该有吗?:

          public class BookIndexViewModel
          {
             public IEnumerable<SelectListItem> Books { get; set; }
             public IEnumerable<SelectListItem> Authors { get; set; }       
          }    
          

          BookIndexViewModel 然后填充到您的控制器中(它可能使用服务来获取 Book 列表和 Author 列表以展平为 ViewModel)??

          我也在学习这些东西,所以愿意接受建议/cmets 和更正!!谢谢。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-12-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多