我正在学习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指令或程序集引用?)
答案 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中)??
我也在学习这些东西,所以对建议/评论和更正持开放态度!感谢。