ASP.NET MVC3 ViewModel - 困惑

时间:2012-07-20 15:50:12

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

我正在学习C#ASP.NET MVC 3中的ViewModel,而我却坚持在View中显示来自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'不包含'作者'的定义,也没有扩展方法'作者'接受类型'System.Collections.Generic.IEnumerable'的第一个参数可以找到(你错过了吗?) using指令或程序集引用?)

6 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

@model IEnumerable<NewBookStore.ViewModels.BookIndexViewModel>应该是 @model BookIndexViewModel代替!

您不希望IEnumerable BookIndexViewModel - 作者属性直接位于BookIndexViewModel之外。

干杯, 迪安

答案 2 :(得分:0)

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

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

@model NewBookStore.ViewModels.BookIndexViewModel

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

答案 3 :(得分:0)

Finnayra,

您的错误是您没有正确定义模型。您的模型已经拥有IEnumerable&lt;&gt;集合,所以不需要使它也是可枚举的。尝试:

@model NewBookStore.ViewModels.BookIndexViewModel

答案 4 :(得分:0)

改为使用

@model NewBookStore.ViewModels.BookIndexViewModel

答案 5 :(得分:0)

[注意 - 我没有足够的exp来使这个评论而不是答案!]

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

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

参见 - &gt; 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的列表和作者的列表以展平到ViewModel中)??

我也在学习这些东西,所以对建议/评论和更正持开放态度!感谢。