2

我正在学习 C# ASP.NET MVC 3 中的 ViewModels,但我一直坚持在我的视图中显示来自 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 指令还是汇编参考?)

4

6 回答 6

2

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

于 2012-07-20T15:55:04.857 回答
0

@model IEnumerable<NewBookStore.ViewModels.BookIndexViewModel>应该 @model BookIndexViewModel改为!

您不想要IEnumerableof BookIndexViewModel- Authors 属性直接位于您的BookIndexViewModel.

干杯,院长

于 2012-07-20T15:54:05.683 回答
0

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

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

@model NewBookStore.ViewModels.BookIndexViewModel

@foreach (var author in Model.Authors)
{
<tr>
    <td>
        @author.Name
    </td>
</tr> 
}
于 2012-07-20T15:54:15.390 回答
0

芬奈拉,

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

@model NewBookStore.ViewModels.BookIndexViewModel
于 2012-07-20T15:54:27.943 回答
0

改用这个

@model NewBookStore.ViewModels.BookIndexViewModel
于 2012-07-20T15:55:16.570 回答
0

[注意-我没有足够的经验来发表评论而不是答案!]

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

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

请参阅-> ASP.NET MVC 3 Viewmodel 模式

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

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

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

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

于 2013-04-05T11:30:57.287 回答